IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Carte SD - Config.txt


Sujet :

C++

  1. #1
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut Carte SD - Config.txt
    Bonjour,

    Je suis en train d'essayer, me blâmer, de comprendre comment je pourraît interagir avec une carte SD sur une carte électronique. Arduino, et son shiend éthernet. Mais bon, c'est pour l'indication que je le met, plus que pour servir de point de départ !

    Avec le site du constructeur, je suis arrivé à tester si la carte était présente, si elle avait bien un fichier. J'ai séparer ça dans des fonctions afin d'alléger l'initialisation qui deviendrais vraiment trop importante et qui nécessitais que l'on face ainsi pour le dépannage futur.

    Au niveau des librairie, j'utilise la librairie SD.h expliqué en parti ici. Et enfin un exemple concret mais qui ne ressemble ni à mon code final ni à ce que je veux faire au final. Exemple.

    Je vais essayer de synthétiser mon code, afin de ne mettre que ce qui concerne le fonctionnement de la carte SD et l'affichage LCD qui fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
     
    /*
      Télécommande sur 433 Mhz bi-directionnelle
      ------------------------------------------
      
      Création : le 29 octobre 2012
      Version 1.0
      ------------------------------------------
      
                Pins utilisés
      TX1 -> Modem 433Mhz
      RX1 <- Modem 433Mhz
      SDA <-> Data I2C
      SCL <-> Horloge I2C
      
      SPI <-> Carte Ethernet / SD Card
      04 (PWM) -> Ethernet CS
      
      10 (PWM) -> Ethernet Librairie
      50 (Digit) -> Ethernet Librairie
      51 (Digit) -> Ethernet Librairie
      52 (Digit) -> Ethernet Librairie
      53 (Digit) -> Ethernet Librairie
      
      AN0 -> Voie 1
      AN1 -> Voie 2
      AN2 -> Voie 3
      AN3 -> Voie 4
      
      22 (Digit) -> Voie 5 = Btn On/Off/On 1
      23 (Digit) -> Voie 5 = Btn On/Off/On 1
      24 (Digit) -> Voie 6 = Btn On/Off/On 2
      25 (Digit) -> Voie 6 = Btn On/Off/On 2
      
      Pour infos:
      - Les voies analogiques sont reliée chacune à leur potar.
      
      - 22 et 23 Corresponde à un potar à 3 positions.
      - 00 = Milieu
      - 10 = Haut
      - 01 = Bas
      
      - 24 et 25 Corresponde à un potar à 3 positions.
      - 00 = Milieu
      - 10 = Haut
      - 01 = Bas
      
    */
     
    /* INC */
    #include <Wire.h>
    #include <SD.h>
     
    /* DEFINITIONS */
    #define adresseLcd 0x63  //Ecran LCD
     
    /* VARIABLES GLOBALES */
    File myFile;
     
    /* SETUP */
    void setup() {
     
      //Lancer les ports séries
      Serial.begin(9600);  //Pour dépanner sur le port USB
      Serial1.begin(9600); //Pour gérer le modem
     
      //Initialiser l'écran LCD
      initLcd();  //Initialiser l'écran LCD
      ecrireLcd("Telecommande 433Mhz", 01);  //Ecrire
      ecrireLcd("Version 1.0", 24);  //Ecrire
      ecrireLcd("Bonjour", 66);  //Ecrire
     
      delay(2000);
     
      //Initialiser la carte SD
      if(initSD()) {
        testFichier("config.txt");
      }
     
      clearLcd();  //Effacer l'écran
    }
     
    /* LOOP */
    void loop() {
    }
     
    /* FONCTION initLCD */
    void initLcd() {
     
      //Initialisation de l'écran par I2C
      Wire.begin();  //Amorce la connection sur SDA et SCL
      Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
      Wire.write((byte)0x00);  //Assigne un null
      Wire.write((byte)0x0C);  //Effacer l'écran
      Wire.write((byte)0x13);  //Allume le rétro-éclairage
      Wire.write((byte)0x04);  //Ne pas afficher le curseur
      Wire.endTransmission();  //Ferme la connexion sur SDA et SCL
    }
     
    /* FONCTION ecrireLcd */
    void ecrireLcd(String texte, int positionEcran) {
     
      //Initialisation de l'écran par I2C
      Wire.begin();  //Amorce la connection sur SDA et SCL
      Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
      Wire.write((byte)0x00);  //Assigne un null
      Wire.write((byte)0x02);  //Placer le curseur
      Wire.write(positionEcran);  //Sur l'écran
      Wire.print(texte);  //Ecrire un texte
      Wire.endTransmission();  //Ferme la connexion sur SDA et SCL
    }
     
    /* FONCTION ecrireLcdChar */
    void ecrireLcdChar(char texte[32], int positionEcran) {
     
      //Initialisation de l'écran par I2C
      Wire.begin();  //Amorce la connection sur SDA et SCL
      Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
      Wire.write((byte)0x00);  //Assigne un null
      Wire.write((byte)0x02);  //Placer le curseur
      Wire.write(positionEcran);  //Sur l'écran
      Wire.write(texte);  //Ecrire un texte
      Wire.endTransmission();  //Ferme la connexion sur SDA et SCL
    }
     
    /* FONCTION clearLcd() */
    void clearLcd() {
     
      //Initialisation de l'écran par I2C
      Wire.begin();  //Amorce la connection sur SDA et SCL
      Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
      Wire.write((byte)0x00);  //Assigne un null
      Wire.write((byte)0x0C);  //Effacer l'écran
      Wire.endTransmission();  //Ferme la connexion sur SDA et SCL
    }
     
    /* FONCTION initSD() */
    boolean initSD() {
     
      clearLcd();  //Effacer l'écran
      ecrireLcd("Init SD Card...", 01);  //Ecrire
     
      //Si la carte n'est pas présente ou qu'elle est en défaut
      if(!SD.begin(4)) {
     
        //Afficher l'écran LCD
        clearLcd();  //Effacer l'écran
        ecrireLcd("Init SD Card failed", 01);  //Ecrire
        delay(1000);
        return false;
      }
     
      clearLcd();  //Effacer l'écran
      ecrireLcd("Init SD Card done", 01);  //Ecrire
     
      delay(1000);
      return true;
    }
     
    /* FONCTION testFichier(fichier) */
    void testFichier(char fic[]) {
     
      clearLcd();  //Effacer l'écran
      ecrireLcd("Init File in SD...", 01);  //Ecrire
     
      //Ouvrir le fichier
      myFile = SD.open(fic, FILE_READ);
     
      //Si le fichier n'est pas présent
      if(myFile == false) {
     
        clearLcd();  //Effacer l'écran
        ecrireLcd("SD: File not found", 01);  //Ecrire
     
        /*
          peut tre remplacer par une demande d'apuie
          de bouton Valider pour passer à l'utilisation de la télécommande
        */
     
        for(;;); //Boucle infini
      }
     
      clearLcd();  //Effacer l'écran
     
      ecrireLcd("File in SD done", 01);  //Ecrire
     
      delay(1000);
    }
     
    /* FONCTION de lecture des configurations */
    void lectureConf() {
     
     
    }
    Maintenant, je vais vous parler des configurations. Dans ma télécommande, je peux "true" ou "false" autoriser des mixages de voies. Donc on écrit pas 0 ou 1 mais bien true ou false. Ça c'est pour ma petite convention.

    Ensuite, j'admet tout type de données. Texte, Chiffre, Byte, Binaire, Exadécimale...

    Chaque modèles à sa propre ligne. Ainsi, si je dois gérer plusieurs modèles, il me faudra faire un fichier écrit de la façon suivante:
    MODELE-01,Nom,Type,Conf1,Conf2,Conf3,Conf4...
    soit:
    MODELE-01,Robot Go,Robot,true,false,false,false...
    MODELE-02,Minimog 02,Sous-marin,true,true,false,false...
    MODELE-03,G-Bot,Robot,false,false,true,false...
    DERNIER-MODELE,MODELE-02

    Il faut bien sûr que j'implémente un switching sur MODELE-xx. Ceci permettant de passer d'un modèle à l'autre sans rebooter la télécommande. A voir plus tard.

    Il faut aussi que je puisse récupérer chaque valeurs, sauf la première dans un tableau, sachant que la limite de longueur est un "\n".

    Et enfin, il faut que je puisse modifier un true pour un false, ainsi de suite.

    Donc ma première question, comment je pourrait écrire une petite fonction qui lise les modèles présent ? (Attention, DERNIER-MODELE,MODELE-02 est là pour pas changer de modèle à chaque redémarrage et donc, il faut le décompter des modèles à récupérer).

    Pour moi qui suis débutant, je galère pas mal. J'insiste donc sur votre indulgence. Je reste ouvert s'il y a moyen de simplifier un peu dans mes fonctions.

    Merci de votre patience.

  2. #2
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Bonjour,

    Hier j'ai un tout petit peu avancer avec un début de fonction.

    J'ai essayer de créer lectureConf().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* FONCTION de lecture des configurations */
    String lectureConf() {
     
      while(myFile.available()) {
     
        Serial.write(myFile.read());
      }
    }
    Je retourne bien le contenu de ma carte en brut. Ok !

    Je pense m'orienter comme suit. Au démarrage, on va lire le nombre de ligne avec lectureConf_NB(). Ici, dans mon exemple je vais stocker 3 modèles d'ont la dernière ligne sera la mémorisation de l'état de la radio à son instinction. Ici donc 4 lignes, le programme me retournera n-1.

    Il me suffira donc de créer une seconde fonction lectureConf_LN(int ligne) qui retournera un tableau de valeurs et qui correspondra à la ligne choisi. Ainsi, si je démarre ma radio, j'irais en ligne n+1 puis je récupérerais tout les états de la radio.

    Donc je pense modifier ma fonction en haut mais maintenant je cherche un morceau de code pour lire le nombre de ligne. Déjà j'aurais avancer d'un grand pas.

    Si possible, avec quelques commentaires afin que je m'en inspire pour que je comprenne.

    Merci une nouvelle fois de votre patience et de votre aide

  3. #3
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Bon alors, du coup, en me faisant un peu aider tout de même. J'ai fait ce qui suit et qui fonctionne parfaitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    /* FONCTION qui retournera le nombre de ligne du fichier */
    int lectureConf_NB() {
     
     
      int nb=0;
     
      //Parcourir le fichier jusqu'à un caractère null
      while(myFile.available()) {
     
        //Si il est rencontrer un saut de ligne
        if(myFile.read() == '\n') {
     
          //Compter
          nb++;
        }
      }
     
      //Retourner le nombre de lignes parcouru
      return nb;
    }
    Maintenant je me consacre à la suite de mon programme. Pour ce faire, je pense m'appuyé sur cet algo:
    //lectureConf_LN(int ligne_a_lire)
    //aller à la ligne_a_lire
    //parcourir la ligne jusqu'au saut de ligne
    //Parser le contenu sur les ',' le dernier caractère étant le saut de ligne
    //Charger le tableau de string avec les valeurs parsés
    //Fin de parcours
    //Return tableau
    Sachant que j'ai dan mon fichier.txt:
    MODELE-01,Robot Go,Robot,true,false,false,false
    MODELE-02,Minimog 02,Soum,false,false,false,false
    MODELE-03,G-Bot,Robot,false,false,false,false
    Et que j'aimerais avoir un tableau de String du type:
    tableau[0]=MODELE-01
    tableau[1]=Robot Go
    tableau[2]=Robot
    tableau[3]=true
    tableau[4]=false
    tableau[5]=false
    tableau[6]=false
    Du coup, je m'interroge aussi sur ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    boolean Mix_V1V2 = false;
     
    //Charger la configuration
    Mix_V1V2 = tableau[3];
     
    //Si le mixage Voie 1 avec Voie 2 est activé
      if(Mix_V1V2) {
        //Mixage voie 1 et voie 2
        mixVoie1 = abs(voies[1] - (voies[2]-90)); 
        mixVoie2 = abs(voies[1] + (voies[2]-90));
     
        //Réécrire les voies avec le mixage
        voies[1] = mixVoie1;
        voies[2] = mixVoie2;
      }
    Sachant que le but est de reprendre la configuration de chaque modèle.

    Donc place à la question. Comment aller en ligne n sachant qu'après il faudra parser ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    le plus simple si ton fichier est aussi court serait probablement de le placer en mémoire en le lisant une bonne fois pour toutes dans une string, puis de travailler avec cette string.
    En plaçant le fichier en mémoire, tu peux aussi utiliser tous les algorithmes STL, à commencer par count.

    Sinon, il te faut enregistrer l'offset du début de chaque ligne pour t'y référer, un simple vector peut faire l'affaire. Puis déplacer le curseur de lecture au bon endroit.

    A savoir que ton algo ne me parait pas correct. Que se passe-t-il si un fichier a une seule et unique ligne ? Il retourne 0. De manière générale, le nombre de lignes lues n'est pas correct, il est décrémenté de 1.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Pour le moment, effectivement, c'est un fichier court.

    Par contre plus tard, ce fichier sera beaucoup plus lourd et prendre plus de paramètres.

    Je suis bien d'accord avec toi sur l'idée de tout charger mais bonjour les temps de démarrage et de fonctionnement.

    Une solution moins facile à mon goût est de faire un fichier par modèles. Si j'ai 150 modèles, j'ai 150 fichiers

    Sérieusement, c'est pas aussi simple que ça le développement en embarqué ! On a pas autant de ram que dans un PC et les méthodes conventionnelles nous sont contraire.

    Donc maintenant, j'avais trouvé une solution facile permettant de ne pas cherché au delà du nombre de ligne déjà entré. Après, si tu a une meilleure solution, je n'ai rien contre il n'est pas trop tard dans mon code.

    Retiens alors que si je fais un fichier par modèle, je dois impérativement compter le nombre de modèles et de plus je modifierais sa structure pour:
    Nom=Nom
    Type=Type
    Option1=true
    Option2=false
    Option3=false
    Option4=false

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    bonjour les temps de démarrage et de fonctionnement.
    On a pas autant de ram que dans un PC
    Tu parles de temps de chargement et fonctionnement mais
    - tu liras toujours plus vite en ram qu'un fichier
    - c'est uniquement au chargement, après ça tu ne l'utilises plus et ne prends plus de place en mémoire : la mémoire ça se libère
    - ça n'a aucune incidence sur le fonctionnement si c'est purement du setup : c'est libéré immédiatement après

    Si tu gardes le fichier uniquement
    - déjà tu lis le fichier caractère par caractère pour compter les \n
    - ensuite tu dois relire le fichier depuis le début pour recompter les \n et t'arrêter à celui qui t'intéresse et atteindre la ligne
    - enfin tu parses le contenu

    Dans tous les cas, l'utilisation d'un vector pour indexer l'offset du début de chaque ligne me parait (plus qu') intéressant.

    Donc maintenant, j'avais trouvé une solution facile permettant de ne pas cherché au delà du nombre de ligne déjà entré.
    Je n'ai pas compris.

    Retiens alors que si je fais un fichier par modèle, je dois impérativement compter le nombre de modèles et de plus je modifierais sa structure pour:
    Tu as peut-être des méthodes disponibles pour lister/compter les fichiers d'un répertoire, et en choisissant une arborescence et nomenclature correcte tu peux très simplement
    - savoir le nombre de modèles
    - ouvrir le modèle correspondant
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Non, je t'arrête tout de suite ! Il n'y a pas de modèle à proprement parlé. Il existe une base permettant de lire et surtout d'enregistrer mais pas dans un fichier structuré. Et le peu que j'ai vue le faire y a vraiment du code pas jolie

    Donc là effectivement, je charge le fichier au démarrage dans le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    /* SETUP */
    void setup() {
    }
    Ensuite, j'aurais peut-être à intervenir en écriture mais ça c'est pour beaucoup plus tard

    Maintenant, il sera de toute façon plus intéressant de lister dans un tableau les noms de fichiers disponible à la racine.
    [modele-01.txt][modele-02.txt][modele-02.txt][memo.txt]

    D'un tableau, il me semble que l'on peut obtenir un count. Du coup plus besoin de relire.

    Ensuite, je ne charge que le fichier en mémoire c'est à dire par exemple modele-01.txt et je rentre ses données dans un tableau, ou il est possible d'avoir une organisation tel que clef=valeur.

    Exemple mal zingué

    Di coup je pense que même niveau code, quitte à tout refaire, autant le faire bien Qu'en pense-tu de cette façon de procédé ?

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Puisque c'est ce que je préconisais, je suis d'accord avec moi-même

    Mais il est inutile d'avoir un tableau des fichiers disponibles, avec une nomenclatures modele-01.txt ... modele-n.txt, s'il n'y a pas de trou dans la liste, un simple index suffit à ouvrir le bon fichier, et seule la valeur de n est intéressante à conserver.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Si, j'en ai besoin car il se trouve que je dois faire apparaître dans des menus sur un écran LCD la possibilité de changer de modèle. Ainsi que le parcours de touts les modèles présent. Nom et Type.

    Donc j'ai accès en permanence à ce tableau. De plus son count m'est utile pour afficher en haut à gauche le numéro du modèle. Exemple d'affichage sur 4 lignes:
    Modele 1/150 Type Robot
    Robot Go : Télémétrie : 5m60 Tension : 5V
    Mix V1V2 : On Light : Off
    [Chge] [Prog] [Opt] [Mix] [Light]
    En bas ce sont des touches de fonction qui change en fonction des pages. Le bouton Chge est là pour changer de modèle. Donc liste 3 modèles par 3 modèles.

    modele-01 1/150 Robot <-
    modele-02 2/150 Soum
    modele-03 3/150 Robot
    [Ok] [Up] [Do] [Return] [Suppr] [Edit]
    Donc maintenant que je repart à 0, je me constitue 3 fichiers atant pour forme clef=valeur.

    Par contre comment liste-t-on des fichiers? C'est ma première question du coup

  10. #10
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    J'avance petit à petit.

    Je suis arrivé à lister les fichiers. J'ai éliminer aussi les noms long

    Bon, jusque là je suis good.

    J'ai pu créer un tableau et le remplir. La preuve par le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    File myFile;
    String tblNomFic[50];
     
    /* SETUP */
    void setup() {
    //Initialiser la carte SD
      if(initSD()) {
        //Lister les fichiers présent dans la carte SD
     
        myFile = SD.open("/");
     
        int i=0;
        while(true) {
     
     
          File entry = myFile.openNextFile();
     
          if(!entry) {
            break;
          }
     
          tblNomFic[i] = entry.name();
     
          i++;
        }
      }
     
      //Fermer le fichier
      myFile.close();
     
      //Compte le nombre de fichiers
      int nbFichiers = sizeof(tblNomFic);
     
     
      Serial.println(tblNomFic[0]);
      Serial.println(tblNomFic[1]);
      Serial.println(tblNomFic[2]);
      Serial.println(tblNomFic[3]);
      Serial.println("");
      Serial.println(nbFichiers);
    }
    Maintenant, je cherche soit à rendre mon tableau à la taille (inconnu) soit à ne prendre que les cases pleine, tableau (connu). Mais déjà se dessine très bien la fonction que je vais faire ensuite après un lourd nettoyage de code.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    sizeof ne te retournera pas le nombre d'occurences du tableau.
    sizeof retourne le nombre d'octet.

    Dans ton cas c'est trivial, le nombre de fichiers est juste i ..
    Et pourquoi utiliser un tableau statique ? Pourquoi pas un vector ? Quid si tu as plus de 50 fichiers ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  12. #12
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Oh punaise, chu passé à côté de ça

    Mon sentiment est partagé entre "Wah c'étais si simple que ça valais pas la peine de chercher une si lourde fonction pour un simple i" et "bon ben chu un boulet qui n'a rien compris au code".

    Je choisit la première solution bien sûr

    Bon, ceci dit, on a fait le plus facile. Lister les fichiers. Pour le départ, je pense que 10 est bien, si je viens à en créer plus, je grandirais le tableau On va économiser de la ram tant que faire ce peu

    Bon, pour ouvrir je sait, maintenant y a l'histoire des clef = valeur. Alors, au dessus j'ai parlé d'un lien ou ça fonctionne. Mais je ne suis pas sûr de vouloir toute les options offerte par ce code. Les commentaires, dans ce cas inutile car les clefs sont explicites. Par contre les espaces entre groupe de clef = valeur oui. Les tabs aussi

    Bon, je vais essayer d'extraire du code et de ranger celui que je viens d'écrire

    La fonction ne me renverra rien, en revanche elle utilisera des variables extérieur.

    Merci de ton aide, j'avance pas mal

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    - si les clés sont toujours dans le même ordre, elles sont inutiles : tu les connais
    - si les clés sont fixées pour être ça et rien d'autre, idem
    -> seule la valeur t'intéresse
    - une simple struct fera l'affaire pour aggréger les données
    - parser les données brutes devient assez trivial
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  14. #14
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Donc si j'ai bien compris, tu me suggère de virer les clefs ?
    J'ai peur que ça devienne moins lisible. Imagine 50 true et false qui se suivent d'en haut à en bas..

    Moi, je garderais les clefs quitte à re-écrire toute la ligne

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Non, tu mets ce que tu veux dans le txt, je parle de ce dont tu as besoin en mémoire.
    Mais dans l'absolue oui, tes clés, dans les conditions que j'ai citées, sont inutiles.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  16. #16
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Ok ! Si j'avais eu qu'une info, effectivement je m'en serais tennu à ta remarque qui m'aurais fait gagner du temps. Mais comme je suis du genre à faire un peu plus évoluer histoire que l'évolutivité soit prise dès le départ... Bref, même si c'est se cassé la tête pour pas grand chose, on appréciera au final.

    Voila ou j'en suis. J'ai créer une fonction qui est capable de me retourné le nombre d’occurrence chargé dans le tableau. C'est assez drastique mais redoutablement efficace.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    File myFile;  //Fichier
    String tblFicMdle[10];  //Le tableau des noms des fichiers modèles
    String tblFicSvg[10];  //Le tableau des noms des fichiers de sauvegardes
    int nbFichierMdle;  //Nombre de fichier
     
    /* SETUP */
    void setup() {
    //Initialiser la carte SD
      if(initSD()) {
     
        //Lister les fichier de sauvegardes
        listeFichier("/svgde/");
     
        //Lister les fichiers de configuration modèle
        nbFichierMdle = listeFichier("/modeles/");
      }
     
      //Fermer le fichier
      myFile.close();
     
      Serial.println("Modèles :");
      Serial.println(tblFicMdle[0]);
      Serial.println(tblFicMdle[1]);
      Serial.println(tblFicMdle[2]);
      Serial.println("");
      Serial.println(nbFichierMdle);
      Serial.println("");
      Serial.println("Sauvegarde :");
      Serial.println(tblFicSvg[0]);
    }
     
    /* FONCTION initSD() */
    boolean initSD() {
     
      clearLcd();  //Effacer l'écran
      ecrireLcd("Init SD Card...", 01);  //Ecrire
     
      //Si la carte n'est pas présente ou qu'elle est en défaut
      if(!SD.begin(4)) {
     
        //Afficher l'écran LCD
        clearLcd();  //Effacer l'écran
        ecrireLcd("Init SD Card failed", 01);  //Ecrire
        delay(1000);
        return false;
      }
     
      clearLcd();  //Effacer l'écran
      ecrireLcd("Init SD Card done", 01);  //Ecrire
     
      delay(1000);
      return true;
    }
     
    /* FONCTION listerFichier() */
    int listeFichier(String chemin) {
     
      int count = 0;
      char path[32];
     
      //Conversion du chemin
      chemin.toCharArray(path, 32);
     
      //Ouvre ce qui est défini par le chemin
      myFile = SD.open(path);
     
      //Tant que c'est vrai
      while(true) {
     
        //Prend le nom du fichier
        File entry = myFile.openNextFile();
     
        //Si c'est la fin
        if(!entry) {
     
          break;  //Sortir de la boucle
        }
     
        //Si c'est le répertoire /modeles/
        if(chemin == "/modeles/") {
     
            //Rentre le nom de fichier dans le tableau des noms de modèles
            tblFicMdle[count] = entry.name();
        }
     
        //Si c'est le répertoire /sauvegarde/
        if(chemin == "/svgde/") {
     
          //Rentre le nom de fichier dans le tableau des noms de sauvegarde
            tblFicSvg[count] = entry.name();
        }
     
        count++; //Compter le nombre de fichier
      } 
     
      //Retourner le nombre de fichier
      return count;
    }
    Bon, j'ai préféré utiliser des if plutôt qu'un case pour limité le phénomène de conversion. A voir si ça faut le coup à terme de changer ! Ça les spécialos du fofo Arduino saurons me le dire

    Là ou je coince désormais. J'ai créer une architecture afin de rendre insensible les fichier au phénomène du Trash~... présent dans la carte mémoire. C'est une solution qui élimine du code et qui simplifie grandement les évolutions futur. Genre tester si le fichier en cours de lecture n'est pas contenu dans un tableau ou l'on élimine les éléments ! Bref 20 lignes pour rien !!!
    J'ai donc ceci:
    /modeles/
    modele001.txt
    modele002.txt
    modele003.txt
    /svgde/
    memo.txt
    Dans memo.txt, j'ai écrit ceci:
    Modele = modele001

    Je me demande si j'ai pas intérêt à faire un tableau à deux dimensions sachant qu'à terme j'ai d'autres données qui doivent rentrés tel que le crédit et les infos de la télécommande. Version, organisation des fichiers...

    J'aurais le même type de tableau ensuite pour faire mes traitements d'option. Donc encore deux tableaux à gérer.

    Une méthode ? Une piste ? Un exemple ? Attention je suis sous avr C++. C'est légèrement différent du C++ classine

  17. #17
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Et bien, c'est tiré par les cheveux mais je suis arrivé à quelque-chose.

    Donc au démarrage, on charge deux répertoire dans un tableau chacun.
    Dans un des répertoire on a un fichier qui dit quel fichier était ouvert et qui doit directement donné les valeurs à chargé.

    Bon, j'en suis à cette étape ou je charge bien le fichier de configuration, mais je dois maintenant choisir entre deux cas dans mon fichier:
    Modele = modele001
    OU
    modele001 //le model
    Dans un cas il faudra éliminer le commentaire mais c'est plus simple à gérer. ou bien, moi qui suis un vrai geek et surtout un poil dans la main, on demande la clef dans un tableau à deux dimensions et on a la valeur.

    Je suis tenter par le cas 2 avec Modele = modele001.

    A ce moment là, comment je puis modifier ma fonction en bas pour charger les données spécifique. Sachant que la même fonction va me servir pour charger et le fichier de conf type sauvegarde, et le fichier du modèle. Donc deux tableaux à rappelés.

    Le code actuel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
    #define SIZE_BUFFER 32  //Nombre de case du buffer
     
    File myFile;  //Fichier
    String tblFicMdle[10];  //Le tableau des noms des fichiers modèles
    String tblFicSvg[10];  //Le tableau des noms des fichiers de sauvegardes
    int nbFichierMdle;  //Nombre de fichier
     
     
      //Initialiser la carte SD
      if(initSD()) {
     
        //Lister les fichier de sauvegardes
        listeFichier("/svgde/");
     
        //Lister les fichiers de configuration modèle
        nbFichierMdle = listeFichier("/modeles/");
     
        //Ouvrir le fichier de sauvegarde memo.txt
        ouvrirFichier("/svgde/" + tblFicSvg[0]);
      }
      else {
     
        //Charger les valeurs par défaut de la radio 
      }
     
      //Fermer le fichier
      //myFile.close();
     
     
      /*
      Serial.println("Modeles :");
      Serial.println(tblFicMdle[0]);
      Serial.println(tblFicMdle[1]);
      Serial.println(tblFicMdle[2]);
      Serial.println("");
      Serial.println(nbFichierMdle);
      Serial.println("");
      Serial.println("Sauvegarde :");
      Serial.println(tblFicSvg[0]);
      */
     
     
    /* FONCTION initSD() */
    boolean initSD() {
     
      clearLcd();  //Effacer l'écran
      ecrireLcd("Init SD Card...", 01);  //Ecrire
     
      //Si la carte n'est pas présente ou qu'elle est en défaut
      if(!SD.begin(4)) {
     
        //Afficher l'écran LCD
        clearLcd();  //Effacer l'écran
        ecrireLcd("Init SD Card failed", 01);  //Ecrire
        delay(1000);
        return false;
      }
     
      clearLcd();  //Effacer l'écran
      ecrireLcd("Init SD Card done", 01);  //Ecrire
     
      delay(1000);
      return true;
    }
     
    /* FONCTION listerFichier() */
    int listeFichier(String chemin) {
     
      int count = 0;
      char path[SIZE_BUFFER];
     
      //Conversion du chemin
      chemin.toCharArray(path, SIZE_BUFFER);
     
      //Ouvre ce qui est défini par le chemin
      myFile = SD.open(path);
     
      //Tant que c'est vrai
      while(true) {
     
        //Prend le nom du fichier
        File entry = myFile.openNextFile();
     
        //Si c'est la fin
        if(!entry) {
     
          break;  //Sortir de la boucle
        }
     
        //Si c'est le répertoire /modeles/
        if(chemin == "/modeles/") {
     
            //Rentre le nom de fichier dans le tableau des noms de modèles
            tblFicMdle[count] = entry.name();
        }
     
        //Si c'est le répertoire /sauvegarde/
        if(chemin == "/svgde/") {
     
          //Rentre le nom de fichier dans le tableau des noms de sauvegarde
            tblFicSvg[count] = entry.name();
        }
     
        count++; //Compter le nombre de fichier
      } 
     
      //Fermer le fichier
      myFile.close();
     
      //Retourner le nombre de fichier
      return count;
    }
     
    /* FONCTION qui ouvre un fichier */
    void ouvrirFichier(String chemin) {
     
      //Variables
      char path[SIZE_BUFFER];
     
      //Transforme le chemin en tableau de carractères
      chemin.toCharArray(path, SIZE_BUFFER);
     
      //Ouvre le fichier de configuration
      myFile = SD.open(path, FILE_READ);
     
      //Erreur d'ouverture du fichier
      if(!myFile) {
     
        clearLcd();  //Effacer l'écran
        ecrireLcd("Fichier failed", 01);  //Ecrire
        for(;;); //Boucle infini (peut tre remplacer par un bouton valider)
      }
     
      //Tant que ce n'est pas la fin du fichier
      while(myFile.available()) {
        Serial.write(myFile.read());
      }
     
      //Fermer le fichier
      myFile.close();
     
      delay(1000);
    }
    Pour le moment je me contente d'afficher le résultat:
    Modele = modele001
    Dernier point, j'aimerais tant que faire ce peu que ça soit pas trop compliqué à digéré de façon à m'y retrouver ensuite.

    Merci encore et me blâmer pas trop. J'essaie d'apprendre par al pratique.

  18. #18
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Bonjour,

    J'avance un peu mais je me heurte à une boucle infini. En partant du sujet skyduino j'ai fait mon code comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
     
    #define SIZE_BUFFER 32  //Nombre de case du buffer
     
    char bufferConf[SIZE_BUFFER];  //Le buffer des fichiers de conf
    String tblConfSvg[clef][valeur];  //Tableau de configuration Sauvegarde
    String tblConfMdle[clef][valeur];  //Tableau de configuration valeur
     
    /* SETUP */
    void setup() {
    //Initialiser la carte SD
      if(initSD()) {
     
        //Lister les fichier de sauvegardes
        listeFichier("/svgde/");
     
        //Lister les fichiers de configuration modèle
        nbFichierMdle = listeFichier("/modeles/");
     
        //Ouvrir le fichier de sauvegarde memo.txt
        ouvrirFichier("/svgde/", tblFicSvg[0]);
      }
      else {
     
        //Charger les valeurs par défaut de la radio 
      }
    }
     
    /* LOOP */
    void loop() {
    }
     
    /* FONCTION initSD() */
    boolean initSD() {
     
      clearLcd();  //Effacer l'écran
      ecrireLcd("Init SD Card...", 01);  //Ecrire
     
      //Si la carte n'est pas présente ou qu'elle est en défaut
      if(!SD.begin(4)) {
     
        //Afficher l'écran LCD
        clearLcd();  //Effacer l'écran
        ecrireLcd("Init SD Card failed", 01);  //Ecrire
        delay(1000);
        return false;
      }
     
      clearLcd();  //Effacer l'écran
      ecrireLcd("Init SD Card done", 01);  //Ecrire
     
      delay(1000);
      return true;
    }
     
    /* FONCTION listerFichier() */
    int listeFichier(String chemin) {
     
      int count = 0;
      char path[SIZE_BUFFER];
     
      //Conversion du chemin
      chemin.toCharArray(path, SIZE_BUFFER);
     
      //Ouvre ce qui est défini par le chemin
      myFile = SD.open(path);
     
      //Tant que c'est vrai
      while(true) {
     
        //Prend le nom du fichier
        File entry = myFile.openNextFile();
     
        //Si c'est la fin
        if(!entry) {
     
          break;  //Sortir de la boucle
        }
     
        //Si le nombre de fichier est plus important que le nombre de place en tableau
        if(count == nbFic) {
     
          break;  //Sortir de la boucle
        }
     
        //Si c'est le répertoire /modeles/
        if(chemin == "/modeles/") {
     
            //Rentre le nom de fichier dans le tableau des noms de modèles
            tblFicMdle[count] = entry.name();
        }
     
        //Si c'est le répertoire /sauvegarde/
        if(chemin == "/svgde/") {
     
          //Rentre le nom de fichier dans le tableau des noms de sauvegarde
            tblFicSvg[count] = entry.name();
        }
     
        count++; //Compter le nombre de fichier
      } 
     
      //Fermer le fichier
      myFile.close();
     
      //Retourner le nombre de fichier
      return count;
    }
     
    /* FONCTION qui ouvre un fichier */
    void ouvrirFichier(String chemin, String fic) {
     
      /*
      
      String tblConfSvg[clef][valeur];  //Tableau de configuration Sauvegarde
    String tblConfMdle[clef][valeur];  //Tableau de configuration valeur
     
    */
     
      //Variables
      char path[SIZE_BUFFER], *key, *val;
      int i, bufferLenght;
     
      //Re crée le chemin
      chemin = chemin + fic;
     
      //Transforme le chemin en tableau de carractères
      chemin.toCharArray(path, SIZE_BUFFER);
     
      //Ouvre le fichier de configuration
      myFile = SD.open(path, FILE_READ);
     
      //Erreur d'ouverture du fichier
      if(!myFile) {
     
        clearLcd();  //Effacer l'écran
        ecrireLcd("Fichier failed", 01);  //Ecrire
        for(;;); //Boucle infini (peut tre remplacer par un bouton valider)
      }
     
      //Tant que ce n'est pas la fin du fichier
      while(myFile.available()) {
     
        //Récupère la ligne
        i=0;
        while((bufferConf[i++] = myFile.read()) != '\n') {
     
          //Si la ligne dépasse le buffer
          if(i == SIZE_BUFFER) {
     
            //Finir la ligne et stopper la lecture
            while(myFile.read() != '\n') {
              break;
            } 
          }
        }
     
        bufferLenght = i;  //Garder en mémoire le nombre de char
        bufferConf[--i] = '\0';  //Finalise la chaine en virant le \n
     
        //Ignore les lignes vides, les commentaires # et //
        if(bufferConf[0] == '\0' || bufferConf[0] == '#' || bufferConf[0] == '//') {
     
          continue;
        }
     
        //Cherche l'emplacement de la clef en ignorant les espaces et tabulations
        i = 0;
        while(bufferConf[i] = ' ' || bufferConf[i] == '\t') {
     
          //Ignore les lignes contenant uniquement des espaces ou des tabulations
          if(++i == bufferLenght) {
     
            break;
          }
     
          key = &bufferConf[i];
          /*
            Ici boucle inini ?
          */
          //Cherche l'emplacement du séparateur
          while(bufferConf[i] != '=') {
     
            //Ignore les espaces et tabulations
            if(bufferConf[i] == ' ' || bufferConf[i] == '\t') {
     
              bufferConf[i] = '\0';
            }
     
            //Ignore les lignes mal formés
            if(++i == bufferLenght) {
              break;
            }
     
          }
     
          /*
          //Gère les lignes mal formés
          if(i == bufferLenght) {
            continue;
          }
            
          bufferConf[i++] = '\0'; //Transforme me séparateur = en \o et continue
            
          //Cherche l'emplacement de la valeur en ignorant espaces et tabulations
          while(bufferConf[i] == ' ' || bufferConf[i] == '\t') {
              
            //Ignore les lignes contenant uniquement des espaces ou des tabulations
            if(++i == bufferLenght) {
              break;
            }
              
            //Gère les lignes mal formés
            if(i == bufferLenght) {
              continue;
            }
              
            val = &bufferConf[i];
              
            //Charger la clef et la valeur dans le tableau à deux dimension
            Serial.println(key);
            Serial.println(val);
          }
          */
          Serial.println(key);
        }  
        /*
        
        //Si c'est le répertoire /sauvegarde/
        if(chemin == "/svgde/") {
        }
        
        //Si c'est le répertoire /modeles/
        if(chemin == "/modeles/") {
        }
        */
     
        //Serial.write(myFile.read());
      }
     
      Serial.println("Fin fichier");
     
      //Fermer le fichier
      myFile.close();
     
      delay(1000);
    }
    A un endroit, je pose la question de la boucle infini. Un test m'a prouvé que l'on ne s'arrêtais pas sur le '=' et que 1 s'incrémentais sauvagement ! Si je vire le while en le mettant en commentaire, je vais bien jusqu'à la fin de fichier. Donc la condition n'arrive jamais. Je cherche pourquoi.

    Pour rappel, mon fichier ne contient qu'une ligne étnant : Modele = modele001.

    Merci de votre aide.

  19. #19
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    C'est bon, j'ai repéré les erreurs et je les ai corrigés

    Maintenant, je cherche à remplir un tableau en deux dimension. A savoir key et val dans le tableau tblConfSvg[clef][valeur].

    Merci pour votre aide.

  20. #20
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Bon, je suis revenu en arrière concernant mon histoire de tableau à deux dimensions. C'est pas possible sous AVR. Donc j'ai pensé à une autre solution et pour ce faire il faudrais encore que j'arrive à remplir le tableau.

    J'ai deux variables, char key* et char val*. Ils sont bien rempli mais ils ne remplissent pas pour autant le tableau de String, ni de char. A la limite un atoi arrive à remplir si le tableau est en int ou en byte. Mais moi je veux gardé en clair les données. Pourquoi donc je pourrait pas convertir du 'char*' to 'char' ?

    Voila un peu le boxon nécessaire et qui fonctionne, sauf les tableaux, pour récupéré clef et valeur sur chef = valeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
     
    #define SIZE_BUFFER 32  //Nombre de case du buffer
     
    /* SETUP */
    void setup() {
    //Initialiser la carte SD
      if(initSD()) {
     
        //Lister les fichier de sauvegardes
        listeFichier("/svgde/");
     
        //Lister les fichiers de configuration modèle
        nbFichierMdle = listeFichier("/modeles/");
     
        //Ouvrir le fichier de sauvegarde
        ouvrirFichier("/svgde/", tblFicSvg[0]);
      }
      else {
     
        //Charger les valeurs par défaut de la radio 
      }
    }
     
    /* LOOP */
    void loop() {
    }
     
    /* FONCTION initSD() */
    boolean initSD() {
     
      clearLcd();  //Effacer l'écran
      ecrireLcd("Init SD Card", 01);  //Ecrire
     
      //Si la carte n'est pas présente ou qu'elle est en défaut
      if(!SD.begin(4)) {
     
        ecrireLcd("Non presente", 21);  //Ecrire
        return false;
      }
     
      ecrireLcd("Sd card... Ok", 21);  //Ecrire
     
      delay(1000);
      return true;
    }
     
    /* FONCTION listerFichier() */
    int listeFichier(String chemin) {
     
      int count = 0;
      char path[SIZE_BUFFER];
     
      //Conversion du chemin
      chemin.toCharArray(path, SIZE_BUFFER);
     
      //Ouvre ce qui est défini par le chemin
      myFile = SD.open(path);
     
      //Tant que c'est vrai
      while(true) {
     
        //Prend le nom du fichier
        File entry = myFile.openNextFile();
     
        //Si c'est la fin
        if(!entry) {
     
          break;  //Sortir de la boucle
        }
     
        //Si le nombre de fichier est plus important que le nombre de place en tableau
        if(count == nbFic) {
     
          break;  //Sortir de la boucle
        }
     
        //Si c'est le répertoire /modeles/
        if(chemin == "/modeles/") {
     
            //Rentre le nom de fichier dans le tableau des noms de modèles
            tblFicMdle[count] = entry.name();
        }
     
        //Si c'est le répertoire /sauvegarde/
        if(chemin == "/svgde/") {
     
          //Rentre le nom de fichier dans le tableau des noms de sauvegarde
            tblFicSvg[count] = entry.name();
        }
     
        count++; //Compter le nombre de fichier
      } 
     
      //Fermer le fichier
      myFile.close();
     
      //Retourner le nombre de fichier
      return count;
    }
     
    /* FONCTION qui ouvre un fichier */
    void ouvrirFichier(String chemin, String fic) {
     
      //Variables
      char path[SIZE_BUFFER], *key, *val;
      int i, bufferLenght, lineCounter = 0;
     
      clearLcd();  //Effacer l'écran
      ecrireLcd("Fichier en lecture", 01);  //Ecrire
     
      //Re crée le chemin
      chemin = chemin + fic;
     
      //Transforme le chemin en tableau de carractères
      chemin.toCharArray(path, SIZE_BUFFER);
     
      //Ouvre le fichier de configuration
      myFile = SD.open(path, FILE_READ);
     
      //Erreur d'ouverture du fichier
      if(!myFile) {
     
        clearLcd();  //Effacer l'écran
        ecrireLcd("Pb fichier", 01);  //Ecrire
        for(;;); //Boucle infini (peut tre remplacer par un bouton valider)
      }
     
      //Tant que ce n'est pas la fin du fichier
      while(myFile.available()) {
     
        //Récupère la ligne
        i=0;
        while((bufferConf[i++] = myFile.read()) != '\n') {
     
          //Si la ligne dépasse le buffer
          if(i == SIZE_BUFFER) {
     
            //Finir la ligne et stopper la lecture
            while(myFile.read() != '\n') {
              break;
            } 
          }
        }
     
        bufferLenght = i;  //Garder en mémoire le nombre de char
        bufferConf[--i] = '\0';  //Finalise la chaine en virant le \n
        ++lineCounter; //Incrémenter le nombre de ligne
     
        //Ignore les lignes vides, les commentaires # et //
        if(bufferConf[0] == '\0' || bufferConf[0] == '#' || bufferConf[0] == '//') {
     
          continue;
        }
     
        //Cherche l'emplacement de la clef en ignorant les espaces et tabulations
        i = 0;
        while(bufferConf[i] == ' ' || bufferConf[i] == '\t') {
     
          //Ignore les lignes contenant uniquement des espaces ou des tabulations
          if(++i == bufferLenght) {
     
            break;
          }
        }
        //Gère les lignes mal formés
        if(i == bufferLenght) {
          continue;
        }
        key = &bufferConf[i];
     
        //Cherche l'emplacement du séparateur
        while(bufferConf[i] != '=') {
     
          //Ignore les espaces et tabulations
          if(bufferConf[i] == ' ' || bufferConf[i] == '\t') {
     
            bufferConf[i] = '\0';
          }
     
          //Ignore les lignes mal formés
          if(++i == bufferLenght) {
            break;
          }
        }
     
        //Gère les lignes mal formés
        if(i == bufferLenght) {
          continue;
        }
     
        bufferConf[i++] = '\0'; //Transforme me séparateur = en \o et continue
     
        //Cherche l'emplacement de la valeur en ignorant espaces et tabulations
        while(bufferConf[i] == ' ' || bufferConf[i] == '\t') {
     
          //Ignore les lignes contenant uniquement des espaces ou des tabulations
          if(++i == bufferLenght) {
            break;
          }
        }
     
        //Gère les lignes mal formés
        if(i == bufferLenght) {
          continue;
        }
     
        val = &bufferConf[i];
     
    String tblConfSvgK[SIZE_CONF];  //Tableau de configuration Sauvegarde Clef
    String tblConfSvgV[SIZE_CONF];  //Tableau de configuration Sauvegarde Val
     
    String tblConfMdleK[SIZE_CONF];  //Tableau de configuration valeur Clef
    String tblConfMdleV[SIZE_CONF];  //Tableau de configuration valeur Val
     
        //Si c'est le répertoire /sauvegarde/
        if(chemin == "/svgde/") {
          tblConfSvgK[lineCounter] = key;
          tblConfSvgV[lineCounter] = val;
        }
     
        //Si c'est le répertoire /modeles/
        if(chemin == "/modeles/") {
          tblConfMdleK[lineCounter] = key;
          tblConfMdleV[lineCounter] = val;
        }
     
        Serial.println(lineCounter);
        Serial.println(key);
        Serial.println(val);
     
        Serial.println(tblConfSvgK[0]);
        Serial.println(tblConfSvgV[0]);
      }
     
      //Fermer le fichier
      myFile.close();
     
      ecrireLcd("Fichier Ok", 21);  //Ecrire
     
      delay(1000);
    }
    Voila, je m'en remet à une amélioration de char ker*, val*; ou à une transformation des valeurs.

    Merci pour votre aide.

Discussions similaires

  1. Config carte reseau ethernet 10/100
    Par toto_titi dans le forum Réseau
    Réponses: 9
    Dernier message: 08/02/2012, 17h57
  2. [Evolution de Config] Ajout d'une carte graphique.
    Par Maxoo dans le forum Ordinateurs
    Réponses: 10
    Dernier message: 10/01/2008, 21h56
  3. Install/Config carte son
    Par lavazavio dans le forum Debian
    Réponses: 4
    Dernier message: 12/12/2007, 21h41
  4. [Config PC de joueur] [Carte son] Inutile ?
    Par Manopower dans le forum Composants
    Réponses: 7
    Dernier message: 26/09/2005, 17h13
  5. [C#] écriture fichier .txt + calcul écart-type
    Par titaB dans le forum Windows Forms
    Réponses: 6
    Dernier message: 26/05/2005, 13h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo