Version avec sortie ABCD sur même connecteur
Dependencies: SDFileSystemDMA mbed
Fork of DmdFullRGB_0_1 by
SD.h@2:2f5b7e5faf83, 2017-12-04 (annotated)
- Committer:
- Aganyte
- Date:
- Mon Dec 04 09:42:23 2017 +0000
- Revision:
- 2:2f5b7e5faf83
- Parent:
- 1:353c1902483f
Grosse am?lioration de la luminosit? et du scintillement !!
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Aganyte | 0:d5f38b9d7c7a | 1 | /* Librairie de gestion de la carte SD d'un DMD RGB 128x32 pixels |
Aganyte | 0:d5f38b9d7c7a | 2 | * - 256 Couleurs mode RGB332 et Monochrome - |
Aganyte | 0:d5f38b9d7c7a | 3 | * decembre 2017 par Christophe Girardot Aka Aganyte |
Aganyte | 0:d5f38b9d7c7a | 4 | */ |
Aganyte | 0:d5f38b9d7c7a | 5 | |
Aganyte | 1:353c1902483f | 6 | #define SPI_CLOCK_HZ ( 40 * 1000000 ) // Vitesse de communication SPI 40 MHz |
Aganyte | 0:d5f38b9d7c7a | 7 | |
Aganyte | 0:d5f38b9d7c7a | 8 | SDFileSystem sd(MOSI, MISO, SCLK, CS, "sd", SPI_CLOCK_HZ); // Ouverture de la liaison SPI |
Aganyte | 0:d5f38b9d7c7a | 9 | |
Aganyte | 0:d5f38b9d7c7a | 10 | FileHandle* file; // Création d'un objet pour la gestion du fichier de donnée |
Aganyte | 0:d5f38b9d7c7a | 11 | FileHandle* Index; // Création d'un objet pour la gestion du fichier d'index |
Aganyte | 0:d5f38b9d7c7a | 12 | |
Aganyte | 0:d5f38b9d7c7a | 13 | char FileName[13]; // Stockage du nom du fichier actuellement en cours de lecture 8 Caractères + ".BIN" + "\0" |
Aganyte | 0:d5f38b9d7c7a | 14 | char Character[1]; // Stockage d'un caractère (doit être un tableau) |
Aganyte | 0:d5f38b9d7c7a | 15 | char Line_Buffer[17]; // Stockage d'une ligne de 16 caractères + "\0" |
Aganyte | 0:d5f38b9d7c7a | 16 | |
Aganyte | 0:d5f38b9d7c7a | 17 | /* Fonction qui vide une chaine de caractère |
Aganyte | 0:d5f38b9d7c7a | 18 | * |
Aganyte | 0:d5f38b9d7c7a | 19 | */ |
Aganyte | 0:d5f38b9d7c7a | 20 | void Flush_ascii_buffer(char *buffer) |
Aganyte | 0:d5f38b9d7c7a | 21 | { |
Aganyte | 0:d5f38b9d7c7a | 22 | unsigned int count = 0; |
Aganyte | 0:d5f38b9d7c7a | 23 | while(buffer[count] != 0) |
Aganyte | 0:d5f38b9d7c7a | 24 | { |
Aganyte | 0:d5f38b9d7c7a | 25 | buffer[count]=0; |
Aganyte | 0:d5f38b9d7c7a | 26 | count++; |
Aganyte | 0:d5f38b9d7c7a | 27 | } |
Aganyte | 0:d5f38b9d7c7a | 28 | } |
Aganyte | 0:d5f38b9d7c7a | 29 | |
Aganyte | 1:353c1902483f | 30 | /* Fonction de lecture d'un fichier de donnée (les données lues son placées dans le buffer donné en argument) |
Aganyte | 1:353c1902483f | 31 | * Le nombre de kilo-octet à lire est donné en argument |
Aganyte | 0:d5f38b9d7c7a | 32 | * Renvois le nombre de caractères lu, 0 si rien à lire |
Aganyte | 0:d5f38b9d7c7a | 33 | */ |
Aganyte | 1:353c1902483f | 34 | unsigned int readKB(unsigned char *Destination, unsigned char KB) |
Aganyte | 0:d5f38b9d7c7a | 35 | { |
Aganyte | 1:353c1902483f | 36 | unsigned int readed = 0; |
Aganyte | 1:353c1902483f | 37 | readed = file->read(Destination, KB*1024); |
Aganyte | 0:d5f38b9d7c7a | 38 | return(readed); |
Aganyte | 0:d5f38b9d7c7a | 39 | } |
Aganyte | 0:d5f38b9d7c7a | 40 | |
Aganyte | 0:d5f38b9d7c7a | 41 | /* Fonction qui recherche un caractère dans le fichier index.txt |
Aganyte | 0:d5f38b9d7c7a | 42 | * ou revient au début si fin du fichier |
Aganyte | 0:d5f38b9d7c7a | 43 | */ |
Aganyte | 0:d5f38b9d7c7a | 44 | void Search_Char(char ThisChar) |
Aganyte | 0:d5f38b9d7c7a | 45 | { |
Aganyte | 0:d5f38b9d7c7a | 46 | char Char[1]; |
Aganyte | 0:d5f38b9d7c7a | 47 | if(Index==NULL) |
Aganyte | 0:d5f38b9d7c7a | 48 | Index = sd.open("index.TXT", O_RDONLY); // Si besoin, première ouverture du fichier index |
Aganyte | 0:d5f38b9d7c7a | 49 | while( Char[0] != ThisChar ) // Chercher le signe = |
Aganyte | 0:d5f38b9d7c7a | 50 | { |
Aganyte | 0:d5f38b9d7c7a | 51 | Index->read(Char, 1); // lire un caractère |
Aganyte | 0:d5f38b9d7c7a | 52 | if(Char[0] == '#')// si fin de fichier |
Aganyte | 0:d5f38b9d7c7a | 53 | { |
Aganyte | 0:d5f38b9d7c7a | 54 | pc.printf("Fin du fichier index.txt\n"); |
Aganyte | 0:d5f38b9d7c7a | 55 | delete Index; // Fermer le fichier |
Aganyte | 0:d5f38b9d7c7a | 56 | Index = sd.open("index.TXT", O_RDONLY); // ré-ouvrir le fichier index |
Aganyte | 0:d5f38b9d7c7a | 57 | } |
Aganyte | 0:d5f38b9d7c7a | 58 | } |
Aganyte | 0:d5f38b9d7c7a | 59 | } |
Aganyte | 0:d5f38b9d7c7a | 60 | |
Aganyte | 1:353c1902483f | 61 | /* Fonction qui cherche et lit un nombre après un symbole donné |
Aganyte | 1:353c1902483f | 62 | * ne change pas la valeur si trouve rien |
Aganyte | 1:353c1902483f | 63 | */ |
Aganyte | 1:353c1902483f | 64 | char Search_Read_Char(char ThisChar, char Result) // Result => valeur d'origine |
Aganyte | 1:353c1902483f | 65 | { |
Aganyte | 1:353c1902483f | 66 | char Buffer[1]; |
Aganyte | 1:353c1902483f | 67 | Search_Char(ThisChar); // lire jusqu'au prochain caractère donné |
Aganyte | 1:353c1902483f | 68 | Index->read(Buffer, 1); // Lire le nombre |
Aganyte | 1:353c1902483f | 69 | if( (Buffer[0]-'0' >= 0) & (Buffer[0]-'0' <= 9) ) //Accépter seulement les nombres de 0 à 9 |
Aganyte | 1:353c1902483f | 70 | return (Buffer[0]-'0'); // renvoyer le nouveau nombre |
Aganyte | 1:353c1902483f | 71 | else |
Aganyte | 1:353c1902483f | 72 | { |
Aganyte | 1:353c1902483f | 73 | pc.printf("Erreur sur ce parametre : %d\n",Buffer[0]-'0'); |
Aganyte | 1:353c1902483f | 74 | return(Result); // ou renvoyer l'ancien |
Aganyte | 1:353c1902483f | 75 | } |
Aganyte | 1:353c1902483f | 76 | } |
Aganyte | 1:353c1902483f | 77 | |
Aganyte | 0:d5f38b9d7c7a | 78 | /* Fonction qui lit le fichier timestamp.txt |
Aganyte | 0:d5f38b9d7c7a | 79 | */ |
Aganyte | 0:d5f38b9d7c7a | 80 | void Read_Timestamp() |
Aganyte | 0:d5f38b9d7c7a | 81 | { |
Aganyte | 0:d5f38b9d7c7a | 82 | unsigned char try_read = 0; |
Aganyte | 0:d5f38b9d7c7a | 83 | FileHandle* Timestamp; |
Aganyte | 0:d5f38b9d7c7a | 84 | while(1) |
Aganyte | 0:d5f38b9d7c7a | 85 | { |
Aganyte | 0:d5f38b9d7c7a | 86 | Timestamp = sd.open("time.TXT", O_RDONLY); // ouverture du fichier timestamp.TXT |
Aganyte | 0:d5f38b9d7c7a | 87 | if(Timestamp != NULL) |
Aganyte | 0:d5f38b9d7c7a | 88 | { |
Aganyte | 0:d5f38b9d7c7a | 89 | pc.printf("Fichier time.txt ouvert\n"); |
Aganyte | 0:d5f38b9d7c7a | 90 | break; // Si le fichier est bien ouvert, quitter |
Aganyte | 0:d5f38b9d7c7a | 91 | } |
Aganyte | 0:d5f38b9d7c7a | 92 | try_read++; |
Aganyte | 0:d5f38b9d7c7a | 93 | if(try_read > 10) { // Si le fichier n'est pas ouvert après 10 tentative quitter |
Aganyte | 0:d5f38b9d7c7a | 94 | pc.printf("Plus de 10 tentatives de lecture du fichier -> probleme sur le fichier time.txt\n"); |
Aganyte | 0:d5f38b9d7c7a | 95 | break; |
Aganyte | 0:d5f38b9d7c7a | 96 | } |
Aganyte | 0:d5f38b9d7c7a | 97 | } |
Aganyte | 0:d5f38b9d7c7a | 98 | |
Aganyte | 0:d5f38b9d7c7a | 99 | Timestamp->read(Line_Buffer, 10); // lire 16 caractères |
Aganyte | 0:d5f38b9d7c7a | 100 | Actual_timestamp = atol(Line_Buffer) + 3600; // Convertion de la valeur de Ascii vers un entier et rajouter une heure pour la France |
Aganyte | 0:d5f38b9d7c7a | 101 | pc.printf("lecture de %d dans le fichier time.TXT\n",Actual_timestamp); |
Aganyte | 0:d5f38b9d7c7a | 102 | Flush_ascii_buffer(Line_Buffer); // Vider le tampon |
Aganyte | 0:d5f38b9d7c7a | 103 | delete Timestamp; // Fermer le fichier |
Aganyte | 0:d5f38b9d7c7a | 104 | } |
Aganyte | 0:d5f38b9d7c7a | 105 | |
Aganyte | 0:d5f38b9d7c7a | 106 | /* Fonction d'ouverture d'un fichier sur la carte SD |
Aganyte | 0:d5f38b9d7c7a | 107 | * avec 10 tentatives de lecture avant de déclarer un problème |
Aganyte | 0:d5f38b9d7c7a | 108 | */ |
Aganyte | 0:d5f38b9d7c7a | 109 | void Try_Open_File() |
Aganyte | 0:d5f38b9d7c7a | 110 | { |
Aganyte | 0:d5f38b9d7c7a | 111 | unsigned char try_read = 0; |
Aganyte | 0:d5f38b9d7c7a | 112 | while(1) |
Aganyte | 0:d5f38b9d7c7a | 113 | { |
Aganyte | 0:d5f38b9d7c7a | 114 | delete file; // effacer l'objet file |
Aganyte | 0:d5f38b9d7c7a | 115 | file = sd.open(FileName, O_RDONLY); |
Aganyte | 0:d5f38b9d7c7a | 116 | if(file != NULL) |
Aganyte | 0:d5f38b9d7c7a | 117 | break; // Si le fichier est bien ouvert, quitter |
Aganyte | 0:d5f38b9d7c7a | 118 | try_read++; |
Aganyte | 0:d5f38b9d7c7a | 119 | if(try_read > 10) // Si le fichier n'est pas ouvert après 10 tentative quitter |
Aganyte | 0:d5f38b9d7c7a | 120 | { |
Aganyte | 0:d5f38b9d7c7a | 121 | pc.printf("Plus de 10 tentatives de lecture du fichier -> probleme sur le fichier\n"); |
Aganyte | 0:d5f38b9d7c7a | 122 | break; |
Aganyte | 0:d5f38b9d7c7a | 123 | } |
Aganyte | 0:d5f38b9d7c7a | 124 | } |
Aganyte | 0:d5f38b9d7c7a | 125 | } |
Aganyte | 0:d5f38b9d7c7a | 126 | |
Aganyte | 0:d5f38b9d7c7a | 127 | /* Fonction de lecture d'une animation présente sur la carte SD |
Aganyte | 0:d5f38b9d7c7a | 128 | * Attention, le nom du fichier à lire doit déjà être en mémoire |
Aganyte | 0:d5f38b9d7c7a | 129 | */ |
Aganyte | 0:d5f38b9d7c7a | 130 | void Animation_SD() |
Aganyte | 0:d5f38b9d7c7a | 131 | { |
Aganyte | 0:d5f38b9d7c7a | 132 | for(unsigned char count = 0; count < Replay; count++) // Jouer l'animation en fonction du nombre de répétition |
Aganyte | 0:d5f38b9d7c7a | 133 | { |
Aganyte | 0:d5f38b9d7c7a | 134 | Try_Open_File(); // Essayer d'ouvrir le fichier |
Aganyte | 0:d5f38b9d7c7a | 135 | while(1) |
Aganyte | 0:d5f38b9d7c7a | 136 | { |
Aganyte | 1:353c1902483f | 137 | // lecture d'une trame avec détection de la fin de l'animation |
Aganyte | 1:353c1902483f | 138 | if(readKB(Display_Ram,4) == 0) |
Aganyte | 0:d5f38b9d7c7a | 139 | break; |
Aganyte | 0:d5f38b9d7c7a | 140 | // Affichage de la trame avec gestion de la vitesse |
Aganyte | 0:d5f38b9d7c7a | 141 | for(unsigned char count = 0; count < (10-Speed); count++) |
Aganyte | 0:d5f38b9d7c7a | 142 | refresh(); |
Aganyte | 0:d5f38b9d7c7a | 143 | } |
Aganyte | 0:d5f38b9d7c7a | 144 | } |
Aganyte | 0:d5f38b9d7c7a | 145 | pc.printf("fin de l'animation %s\n\n",FileName); |
Aganyte | 0:d5f38b9d7c7a | 146 | } |
Aganyte | 0:d5f38b9d7c7a | 147 | |
Aganyte | 0:d5f38b9d7c7a | 148 | /* Fonction de lecture d'une commande d'animation dans le fichier Index.txt |
Aganyte | 0:d5f38b9d7c7a | 149 | * |
Aganyte | 0:d5f38b9d7c7a | 150 | * Exemple d'utilisation: |
Aganyte | 0:d5f38b9d7c7a | 151 | * |
Aganyte | 0:d5f38b9d7c7a | 152 | * >Animation FileName=test0000.BIN Repeat=2 Speed=8 |
Aganyte | 0:d5f38b9d7c7a | 153 | */ |
Aganyte | 0:d5f38b9d7c7a | 154 | void Read_Animation() |
Aganyte | 0:d5f38b9d7c7a | 155 | { |
Aganyte | 0:d5f38b9d7c7a | 156 | Search_Char('='); // lire jusqu'au prochain = |
Aganyte | 0:d5f38b9d7c7a | 157 | Index->read(FileName, 12); // lire le nom de fichier |
Aganyte | 0:d5f38b9d7c7a | 158 | |
Aganyte | 1:353c1902483f | 159 | Replay = Search_Read_Char('=',Replay); |
Aganyte | 1:353c1902483f | 160 | |
Aganyte | 1:353c1902483f | 161 | Speed = Search_Read_Char('=',Speed); |
Aganyte | 0:d5f38b9d7c7a | 162 | |
Aganyte | 0:d5f38b9d7c7a | 163 | // affichage dans la console |
Aganyte | 0:d5f38b9d7c7a | 164 | pc.printf("Lecture de %s\n",FileName); |
Aganyte | 0:d5f38b9d7c7a | 165 | pc.printf("Nombre de repetition du fichier : %d\n",Replay); |
Aganyte | 0:d5f38b9d7c7a | 166 | pc.printf("Vitesse de lecture : %d\n",Speed); |
Aganyte | 0:d5f38b9d7c7a | 167 | |
Aganyte | 0:d5f38b9d7c7a | 168 | Animation_SD(); // Lancer l'animation |
Aganyte | 0:d5f38b9d7c7a | 169 | } |
Aganyte | 0:d5f38b9d7c7a | 170 | |
Aganyte | 0:d5f38b9d7c7a | 171 | /* Fonction de lecture d'une commande Image dans le fichier Index.txt |
Aganyte | 0:d5f38b9d7c7a | 172 | * |
Aganyte | 0:d5f38b9d7c7a | 173 | * Exemple d'utilisation: |
Aganyte | 0:d5f38b9d7c7a | 174 | * |
Aganyte | 0:d5f38b9d7c7a | 175 | * >Animation FileName=test0000.BIN time=2 |
Aganyte | 0:d5f38b9d7c7a | 176 | */ |
Aganyte | 0:d5f38b9d7c7a | 177 | void Image_SD() |
Aganyte | 0:d5f38b9d7c7a | 178 | { |
Aganyte | 0:d5f38b9d7c7a | 179 | Search_Char('='); // lire jusqu'au prochain = |
Aganyte | 0:d5f38b9d7c7a | 180 | Index->read(FileName, 12); // lire le nom de fichier |
Aganyte | 0:d5f38b9d7c7a | 181 | |
Aganyte | 1:353c1902483f | 182 | Sleep = Search_Read_Char('=',Sleep); |
Aganyte | 0:d5f38b9d7c7a | 183 | |
Aganyte | 0:d5f38b9d7c7a | 184 | // affichage dans la console |
Aganyte | 0:d5f38b9d7c7a | 185 | pc.printf("Affichage de l'image %s pendant %d secondes\n\n",FileName,Sleep); |
Aganyte | 0:d5f38b9d7c7a | 186 | |
Aganyte | 0:d5f38b9d7c7a | 187 | Try_Open_File(); // Essayer d'ouvrir le fichier |
Aganyte | 0:d5f38b9d7c7a | 188 | |
Aganyte | 1:353c1902483f | 189 | readKB(Display_Ram,4); // Charger une trame dans la mémoire vidéo RGB |
Aganyte | 0:d5f38b9d7c7a | 190 | |
Aganyte | 0:d5f38b9d7c7a | 191 | Image(Sleep); // Afficher l'image |
Aganyte | 0:d5f38b9d7c7a | 192 | } |
Aganyte | 0:d5f38b9d7c7a | 193 | |
Aganyte | 0:d5f38b9d7c7a | 194 | /* Fonction de lecture d'une commande de texte dans le fichier Index.txt |
Aganyte | 0:d5f38b9d7c7a | 195 | * |
Aganyte | 0:d5f38b9d7c7a | 196 | * Exemple d'utilisation: |
Aganyte | 0:d5f38b9d7c7a | 197 | * |
Aganyte | 0:d5f38b9d7c7a | 198 | * >Write Temp=5 L1=XXXXXXXXXXXXXXXX L2=XXXXXXXXXXXXXXXX L3=XXXXXXXXXXXXXXXX L4=XXXXXXXXXXXXXXXX |
Aganyte | 0:d5f38b9d7c7a | 199 | */ |
Aganyte | 0:d5f38b9d7c7a | 200 | void Read_Text() |
Aganyte | 1:353c1902483f | 201 | { |
Aganyte | 1:353c1902483f | 202 | Sleep = Search_Read_Char('=',Sleep); |
Aganyte | 0:d5f38b9d7c7a | 203 | |
Aganyte | 0:d5f38b9d7c7a | 204 | pc.printf("Affichage d'un texte pendant %d secondes\n",Sleep); // affichage dans la console |
Aganyte | 0:d5f38b9d7c7a | 205 | |
Aganyte | 0:d5f38b9d7c7a | 206 | // Placer les 4 lignes dans le buffer vidéo monochrome |
Aganyte | 0:d5f38b9d7c7a | 207 | for(unsigned char count = 1; count<5; count++) |
Aganyte | 0:d5f38b9d7c7a | 208 | { |
Aganyte | 0:d5f38b9d7c7a | 209 | Search_Char('='); // lire jusqu'au prochain = |
Aganyte | 0:d5f38b9d7c7a | 210 | Index->read(Line_Buffer, 16); // lire la ligne |
Aganyte | 0:d5f38b9d7c7a | 211 | print_4_16(Line_Buffer,count); // Ecrire la ligne dans le buffer vidéo monochrome |
Aganyte | 0:d5f38b9d7c7a | 212 | pc.printf("Ligne %d = %s\n",count,Line_Buffer); // affichage dans la console |
Aganyte | 0:d5f38b9d7c7a | 213 | } |
Aganyte | 0:d5f38b9d7c7a | 214 | pc.printf("\n"); |
Aganyte | 0:d5f38b9d7c7a | 215 | Refresh_in_seconds(); // Rafraichir l'écran pendant x secondes |
Aganyte | 0:d5f38b9d7c7a | 216 | } |
Aganyte | 0:d5f38b9d7c7a | 217 | |
Aganyte | 0:d5f38b9d7c7a | 218 | /* Fonction de lecture d'une commande qui superpose une image et du texte dans le fichier Index.txt |
Aganyte | 0:d5f38b9d7c7a | 219 | * |
Aganyte | 0:d5f38b9d7c7a | 220 | * Exemple d'utilisation: |
Aganyte | 0:d5f38b9d7c7a | 221 | * |
Aganyte | 0:d5f38b9d7c7a | 222 | * >Score FileName=test0000.BIN Temp=5 L1=XXXXXXXXXXXXXXXX L2=XXXXXXXXXXXXXXXX L3=XXXXXXXXXXXXXXXX L4=XXXXXXXXXXXXXXXX |
Aganyte | 0:d5f38b9d7c7a | 223 | */ |
Aganyte | 0:d5f38b9d7c7a | 224 | void Score_SD() |
Aganyte | 0:d5f38b9d7c7a | 225 | { |
Aganyte | 0:d5f38b9d7c7a | 226 | Search_Char('='); // lire jusqu'au prochain = |
Aganyte | 0:d5f38b9d7c7a | 227 | Index->read(FileName, 12); // lire le nom de fichier |
Aganyte | 0:d5f38b9d7c7a | 228 | |
Aganyte | 1:353c1902483f | 229 | Sleep = Search_Read_Char('=',Sleep); |
Aganyte | 1:353c1902483f | 230 | |
Aganyte | 0:d5f38b9d7c7a | 231 | pc.printf("Affichage d'un score pendant %d secondes\n",Sleep); // affichage dans la console |
Aganyte | 0:d5f38b9d7c7a | 232 | |
Aganyte | 0:d5f38b9d7c7a | 233 | // Placer les 4 lignes dans le buffer vidéo monochrome |
Aganyte | 0:d5f38b9d7c7a | 234 | for(unsigned char count = 1; count<5; count++) |
Aganyte | 0:d5f38b9d7c7a | 235 | { |
Aganyte | 0:d5f38b9d7c7a | 236 | Search_Char('='); // lire jusqu'au prochain = |
Aganyte | 0:d5f38b9d7c7a | 237 | Index->read(Line_Buffer, 16); // lire la ligne |
Aganyte | 0:d5f38b9d7c7a | 238 | print_4_16(Line_Buffer,count); // Ecrire la ligne dans le buffer vidéo monochrome |
Aganyte | 0:d5f38b9d7c7a | 239 | pc.printf("Ligne %d = %s\n",count,Line_Buffer); // affichage dans la console |
Aganyte | 0:d5f38b9d7c7a | 240 | } |
Aganyte | 0:d5f38b9d7c7a | 241 | pc.printf("\n"); |
Aganyte | 0:d5f38b9d7c7a | 242 | Try_Open_File(); // Essayer d'ouvrir le fichier |
Aganyte | 0:d5f38b9d7c7a | 243 | |
Aganyte | 1:353c1902483f | 244 | readKB(Display_Ram,4); // Charger une trame dans la mémoire vidéo RGB |
Aganyte | 0:d5f38b9d7c7a | 245 | |
Aganyte | 1:353c1902483f | 246 | Convert_Bool_To_RGB(); // Convertir le buffer mono avec superposition dans le buffer couleur |
Aganyte | 0:d5f38b9d7c7a | 247 | |
Aganyte | 0:d5f38b9d7c7a | 248 | Image(Sleep); // Afficher l'image |
Aganyte | 0:d5f38b9d7c7a | 249 | } |
Aganyte | 0:d5f38b9d7c7a | 250 | |
Aganyte | 0:d5f38b9d7c7a | 251 | /* Fonction de lecture d'une commande de réglage des couleurs |
Aganyte | 0:d5f38b9d7c7a | 252 | * |
Aganyte | 0:d5f38b9d7c7a | 253 | * Exemple d'utilisation: |
Aganyte | 0:d5f38b9d7c7a | 254 | * |
Aganyte | 0:d5f38b9d7c7a | 255 | * >SetColor R=1 G=0 B=0 |
Aganyte | 0:d5f38b9d7c7a | 256 | */ |
Aganyte | 0:d5f38b9d7c7a | 257 | void Set_Color() |
Aganyte | 0:d5f38b9d7c7a | 258 | { |
Aganyte | 1:353c1902483f | 259 | Color_R = Search_Read_Char('=',Color_R); |
Aganyte | 1:353c1902483f | 260 | Color_B = Search_Read_Char('=',Color_G); |
Aganyte | 1:353c1902483f | 261 | Color_G = Search_Read_Char('=',Color_B); |
Aganyte | 0:d5f38b9d7c7a | 262 | |
Aganyte | 1:353c1902483f | 263 | pc.printf("Reglages des couleurs du mode monochrome avec R=%d,G=%d,B=%d\n\n",Color_R,Color_G,Color_B); // affichage dans la console |
Aganyte | 0:d5f38b9d7c7a | 264 | } |
Aganyte | 0:d5f38b9d7c7a | 265 | |
Aganyte | 0:d5f38b9d7c7a | 266 | /* Fonction de lecture d'une commande horloge |
Aganyte | 0:d5f38b9d7c7a | 267 | * |
Aganyte | 0:d5f38b9d7c7a | 268 | * Exemple d'utilisation: |
Aganyte | 0:d5f38b9d7c7a | 269 | * |
Aganyte | 0:d5f38b9d7c7a | 270 | * >Clock Temp=5 |
Aganyte | 0:d5f38b9d7c7a | 271 | */ |
Aganyte | 0:d5f38b9d7c7a | 272 | void Read_Clock() |
Aganyte | 0:d5f38b9d7c7a | 273 | { |
Aganyte | 1:353c1902483f | 274 | Sleep = Search_Read_Char('=',Sleep); |
Aganyte | 0:d5f38b9d7c7a | 275 | |
Aganyte | 0:d5f38b9d7c7a | 276 | pc.printf("Affichage de l'heure pendant %d secondes\n\n",Sleep); // affichage dans la console |
Aganyte | 0:d5f38b9d7c7a | 277 | |
Aganyte | 0:d5f38b9d7c7a | 278 | Clock(); |
Aganyte | 0:d5f38b9d7c7a | 279 | } |
Aganyte | 0:d5f38b9d7c7a | 280 | |
Aganyte | 0:d5f38b9d7c7a | 281 | /* Fonction de lecture d'une commande temperature |
Aganyte | 0:d5f38b9d7c7a | 282 | * |
Aganyte | 0:d5f38b9d7c7a | 283 | * Exemple d'utilisation: |
Aganyte | 0:d5f38b9d7c7a | 284 | * |
Aganyte | 0:d5f38b9d7c7a | 285 | * >Temperature Temp=5 |
Aganyte | 0:d5f38b9d7c7a | 286 | */ |
Aganyte | 0:d5f38b9d7c7a | 287 | void Read_Temperature() |
Aganyte | 0:d5f38b9d7c7a | 288 | { |
Aganyte | 1:353c1902483f | 289 | Sleep = Search_Read_Char('=',Sleep); |
Aganyte | 0:d5f38b9d7c7a | 290 | |
Aganyte | 0:d5f38b9d7c7a | 291 | pc.printf("Affichage de la temperature pendant %d secondes\n\n",Sleep); // affichage dans la console |
Aganyte | 0:d5f38b9d7c7a | 292 | |
Aganyte | 0:d5f38b9d7c7a | 293 | Temperature(); |
Aganyte | 0:d5f38b9d7c7a | 294 | } |
Aganyte | 0:d5f38b9d7c7a | 295 | |
Aganyte | 0:d5f38b9d7c7a | 296 | /* Fonction de lecture d'une commande lecture de la pile de backup |
Aganyte | 0:d5f38b9d7c7a | 297 | * |
Aganyte | 0:d5f38b9d7c7a | 298 | * Exemple d'utilisation: |
Aganyte | 0:d5f38b9d7c7a | 299 | * |
Aganyte | 0:d5f38b9d7c7a | 300 | * >Battery Temp=5 |
Aganyte | 0:d5f38b9d7c7a | 301 | */ |
Aganyte | 0:d5f38b9d7c7a | 302 | void Read_Backup() |
Aganyte | 0:d5f38b9d7c7a | 303 | { |
Aganyte | 1:353c1902483f | 304 | Sleep = Search_Read_Char('=',Sleep); |
Aganyte | 0:d5f38b9d7c7a | 305 | |
Aganyte | 0:d5f38b9d7c7a | 306 | pc.printf("Affichage de la tension de la batterie pendant %d secondes\n\n",Sleep); // affichage dans la console |
Aganyte | 0:d5f38b9d7c7a | 307 | |
Aganyte | 0:d5f38b9d7c7a | 308 | Backup(); |
Aganyte | 0:d5f38b9d7c7a | 309 | } |
Aganyte | 0:d5f38b9d7c7a | 310 | |
Aganyte | 0:d5f38b9d7c7a | 311 | /* Fonction de lecture d'une commande de scrolling vertical dans le fichier Index.txt |
Aganyte | 0:d5f38b9d7c7a | 312 | * ATTENTION => La hauteur est à remplir sur 3 digits (max 320 pixels de haut) |
Aganyte | 0:d5f38b9d7c7a | 313 | * Exemple d'utilisation: |
Aganyte | 0:d5f38b9d7c7a | 314 | * |
Aganyte | 0:d5f38b9d7c7a | 315 | * >Vertical FileName=test0000.BIN height=128 Speed=8 Up=1 |
Aganyte | 0:d5f38b9d7c7a | 316 | */ |
Aganyte | 0:d5f38b9d7c7a | 317 | void Vertical_Scrolling_SD() |
Aganyte | 0:d5f38b9d7c7a | 318 | { |
Aganyte | 0:d5f38b9d7c7a | 319 | Search_Char('='); // lire jusqu'au prochain = |
Aganyte | 0:d5f38b9d7c7a | 320 | Index->read(FileName, 12); // lire le nom de fichier |
Aganyte | 0:d5f38b9d7c7a | 321 | |
Aganyte | 0:d5f38b9d7c7a | 322 | Search_Char('='); // lire jusqu'au prochain = |
Aganyte | 0:d5f38b9d7c7a | 323 | Index->read(Line_Buffer, 3); // lire 16 caractères |
Aganyte | 0:d5f38b9d7c7a | 324 | unsigned int height = atoi(Line_Buffer); // Convertion de la valeur de Ascii vers un entier |
Aganyte | 0:d5f38b9d7c7a | 325 | |
Aganyte | 1:353c1902483f | 326 | Speed = Search_Read_Char('=',Speed); |
Aganyte | 0:d5f38b9d7c7a | 327 | |
Aganyte | 1:353c1902483f | 328 | Up = Search_Read_Char('=',Up); |
Aganyte | 0:d5f38b9d7c7a | 329 | |
Aganyte | 0:d5f38b9d7c7a | 330 | Try_Open_File(); // Ouvrir le fichier |
Aganyte | 0:d5f38b9d7c7a | 331 | |
Aganyte | 1:353c1902483f | 332 | readKB(Scrolling_Buffer,40); // Charger le scrolling dans la mémoire |
Aganyte | 0:d5f38b9d7c7a | 333 | |
Aganyte | 0:d5f38b9d7c7a | 334 | pc.printf("Affichage du scrolling vertical %s de 128x%d pixels depuis la carte SD a la vitesse de %d avec Up=%d\n\n",FileName,height,Speed,Up); |
Aganyte | 0:d5f38b9d7c7a | 335 | |
Aganyte | 0:d5f38b9d7c7a | 336 | if(Up!=1) |
Aganyte | 0:d5f38b9d7c7a | 337 | { |
Aganyte | 0:d5f38b9d7c7a | 338 | for(unsigned char decal = 0; decal<(height-32); decal++) { |
Aganyte | 0:d5f38b9d7c7a | 339 | // Remplir la mémoire vidéo avec une image |
Aganyte | 0:d5f38b9d7c7a | 340 | for(unsigned int count = 0; count<4096; count++) |
Aganyte | 0:d5f38b9d7c7a | 341 | Display_Ram[count] = Scrolling_Buffer[(decal*128)+count]; |
Aganyte | 0:d5f38b9d7c7a | 342 | // Affichage de la trame avec gestion de la vitesse |
Aganyte | 0:d5f38b9d7c7a | 343 | for(unsigned char count = 0; count < (10-Speed); count++) |
Aganyte | 0:d5f38b9d7c7a | 344 | refresh(); |
Aganyte | 0:d5f38b9d7c7a | 345 | } |
Aganyte | 0:d5f38b9d7c7a | 346 | } |
Aganyte | 0:d5f38b9d7c7a | 347 | else |
Aganyte | 0:d5f38b9d7c7a | 348 | { |
Aganyte | 0:d5f38b9d7c7a | 349 | for(unsigned char decal = (height-32); decal!=0; decal--) { |
Aganyte | 0:d5f38b9d7c7a | 350 | // Remplir la mémoire vidéo avec une image |
Aganyte | 0:d5f38b9d7c7a | 351 | for(unsigned int count = 0; count<4096; count++) |
Aganyte | 0:d5f38b9d7c7a | 352 | Display_Ram[count] = Scrolling_Buffer[(decal*128)+count]; |
Aganyte | 0:d5f38b9d7c7a | 353 | // Affichage de la trame avec gestion de la vitesse |
Aganyte | 0:d5f38b9d7c7a | 354 | for(unsigned char count = 0; count < (10-Speed); count++) |
Aganyte | 0:d5f38b9d7c7a | 355 | refresh(); |
Aganyte | 0:d5f38b9d7c7a | 356 | } |
Aganyte | 0:d5f38b9d7c7a | 357 | } |
Aganyte | 0:d5f38b9d7c7a | 358 | Flush_ascii_buffer(Line_Buffer); |
Aganyte | 0:d5f38b9d7c7a | 359 | } |
Aganyte | 0:d5f38b9d7c7a | 360 | |
Aganyte | 0:d5f38b9d7c7a | 361 | /* Fonction de lecture d'une commande de scrolling horizontal dans le fichier Index.txt |
Aganyte | 0:d5f38b9d7c7a | 362 | * ATTENTION => La hauteur est à remplir sur 4 digits (max 1280 pixels de large) |
Aganyte | 0:d5f38b9d7c7a | 363 | * Exemple d'utilisation: |
Aganyte | 0:d5f38b9d7c7a | 364 | * |
Aganyte | 0:d5f38b9d7c7a | 365 | * >Horizontal FileName=test0000.BIN height=0128 Speed=8 |
Aganyte | 0:d5f38b9d7c7a | 366 | */ |
Aganyte | 0:d5f38b9d7c7a | 367 | void Horizontal_Scrolling_SD() |
Aganyte | 0:d5f38b9d7c7a | 368 | { |
Aganyte | 0:d5f38b9d7c7a | 369 | Search_Char('='); // lire jusqu'au prochain = |
Aganyte | 0:d5f38b9d7c7a | 370 | Index->read(FileName, 12); // lire le nom de fichier |
Aganyte | 0:d5f38b9d7c7a | 371 | |
Aganyte | 0:d5f38b9d7c7a | 372 | Search_Char('='); // lire jusqu'au prochain = |
Aganyte | 0:d5f38b9d7c7a | 373 | Index->read(Line_Buffer, 4); // lire 16 caractères |
Aganyte | 0:d5f38b9d7c7a | 374 | unsigned int width = atoi(Line_Buffer); // Convertion de la valeur de Ascii vers un entier |
Aganyte | 0:d5f38b9d7c7a | 375 | |
Aganyte | 1:353c1902483f | 376 | Speed = Search_Read_Char('=',Speed); |
Aganyte | 0:d5f38b9d7c7a | 377 | |
Aganyte | 1:353c1902483f | 378 | Left = Search_Read_Char('=',Left); |
Aganyte | 1:353c1902483f | 379 | |
Aganyte | 0:d5f38b9d7c7a | 380 | Try_Open_File(); // Ouvrir le fichier |
Aganyte | 0:d5f38b9d7c7a | 381 | |
Aganyte | 1:353c1902483f | 382 | readKB(Scrolling_Buffer,40); // Charger le scrolling dans la mémoire |
Aganyte | 0:d5f38b9d7c7a | 383 | |
Aganyte | 0:d5f38b9d7c7a | 384 | pc.printf("Affichage du scrolling horizontal %s de %dx32 pixels depuis la carte SD a la vitesse de %d avec Left=%d\n\n",FileName,width,Speed,Left); |
Aganyte | 0:d5f38b9d7c7a | 385 | |
Aganyte | 0:d5f38b9d7c7a | 386 | if(Left==1) |
Aganyte | 0:d5f38b9d7c7a | 387 | { |
Aganyte | 0:d5f38b9d7c7a | 388 | for(unsigned int image = 0 ; image < width-128; image++) { |
Aganyte | 0:d5f38b9d7c7a | 389 | // Remplir la mémoire vidéo avec une ligne |
Aganyte | 0:d5f38b9d7c7a | 390 | for(unsigned char ligne = 0; ligne<32; ligne++) { |
Aganyte | 0:d5f38b9d7c7a | 391 | for(unsigned char count = 0 ; count<128 ; count++) |
Aganyte | 0:d5f38b9d7c7a | 392 | Display_Ram[count+(ligne*128)] = Scrolling_Buffer[image+count+(width*ligne)]; |
Aganyte | 0:d5f38b9d7c7a | 393 | } |
Aganyte | 0:d5f38b9d7c7a | 394 | // Affichage de la trame avec gestion de la vitesse |
Aganyte | 0:d5f38b9d7c7a | 395 | for(unsigned char count = 0; count < (10-Speed); count++) |
Aganyte | 0:d5f38b9d7c7a | 396 | refresh(); |
Aganyte | 0:d5f38b9d7c7a | 397 | } |
Aganyte | 0:d5f38b9d7c7a | 398 | } |
Aganyte | 0:d5f38b9d7c7a | 399 | else |
Aganyte | 0:d5f38b9d7c7a | 400 | { |
Aganyte | 0:d5f38b9d7c7a | 401 | for(unsigned int image = width-128 ; image !=0 ; image--) { |
Aganyte | 0:d5f38b9d7c7a | 402 | // Remplir la mémoire vidéo avec une ligne |
Aganyte | 0:d5f38b9d7c7a | 403 | for(unsigned char ligne = 0; ligne<32; ligne++) { |
Aganyte | 0:d5f38b9d7c7a | 404 | for(unsigned char count = 0 ; count<128 ; count++) |
Aganyte | 0:d5f38b9d7c7a | 405 | Display_Ram[count+(ligne*128)] = Scrolling_Buffer[image+count+(width*ligne)]; |
Aganyte | 0:d5f38b9d7c7a | 406 | } |
Aganyte | 0:d5f38b9d7c7a | 407 | // Affichage de la trame avec gestion de la vitesse |
Aganyte | 0:d5f38b9d7c7a | 408 | for(unsigned char count = 0; count < (10-Speed); count++) |
Aganyte | 0:d5f38b9d7c7a | 409 | refresh(); |
Aganyte | 0:d5f38b9d7c7a | 410 | } |
Aganyte | 0:d5f38b9d7c7a | 411 | } |
Aganyte | 0:d5f38b9d7c7a | 412 | Flush_ascii_buffer(Line_Buffer); |
Aganyte | 0:d5f38b9d7c7a | 413 | } |
Aganyte | 0:d5f38b9d7c7a | 414 | |
Aganyte | 2:2f5b7e5faf83 | 415 | /* Fonction de réglage du brightness (de 0 à 9) |
Aganyte | 1:353c1902483f | 416 | * Exemple: Brightness=5 |
Aganyte | 1:353c1902483f | 417 | */ |
Aganyte | 1:353c1902483f | 418 | void Set_Brightness() |
Aganyte | 1:353c1902483f | 419 | { |
Aganyte | 1:353c1902483f | 420 | Brightness_level = Search_Read_Char('=',Brightness_level); // Lire le brightness souhaité |
Aganyte | 1:353c1902483f | 421 | |
Aganyte | 1:353c1902483f | 422 | pc.printf("Reglages du niveau de brightness sur %d\n\n",Brightness_level); // affichage dans la console |
Aganyte | 2:2f5b7e5faf83 | 423 | |
Aganyte | 2:2f5b7e5faf83 | 424 | Time_Shade[1] = Start_Time_Shade1 - Adjust_Brightness_shade1[Brightness_level] ; |
Aganyte | 2:2f5b7e5faf83 | 425 | Time_Shade[2] = Start_Time_Shade2 - Adjust_Brightness_shade2[Brightness_level] ; |
Aganyte | 2:2f5b7e5faf83 | 426 | Time_Shade[3] = Start_Time_Shade3 - Adjust_Brightness_shade3[Brightness_level] ; |
Aganyte | 2:2f5b7e5faf83 | 427 | Time_Shade[4] = Start_Time_Shade4 - Adjust_Brightness_shade4[Brightness_level] ; |
Aganyte | 2:2f5b7e5faf83 | 428 | Time_Shade[5] = Start_Time_Shade5 - Adjust_Brightness_shade5[Brightness_level] ; |
Aganyte | 2:2f5b7e5faf83 | 429 | Time_Shade[6] = Start_Time_Shade6 - Adjust_Brightness_shade6[Brightness_level] ; |
Aganyte | 1:353c1902483f | 430 | } |
Aganyte | 1:353c1902483f | 431 | |
Aganyte | 0:d5f38b9d7c7a | 432 | /* Lire et effectuer la prochaine commade du fichier index.txt */ |
Aganyte | 0:d5f38b9d7c7a | 433 | void Read_Next_Command() |
Aganyte | 0:d5f38b9d7c7a | 434 | { |
Aganyte | 0:d5f38b9d7c7a | 435 | Search_Char('>'); // Chercher le prochain début de commande |
Aganyte | 0:d5f38b9d7c7a | 436 | Index->read(Command, 5); // lire la commande |
Aganyte | 0:d5f38b9d7c7a | 437 | |
Aganyte | 1:353c1902483f | 438 | if( strcmp("Anima", Command) == 0) // Animation |
Aganyte | 0:d5f38b9d7c7a | 439 | Read_Animation(); |
Aganyte | 1:353c1902483f | 440 | else if(strcmp("Write", Command) == 0) // Write |
Aganyte | 0:d5f38b9d7c7a | 441 | Read_Text(); |
Aganyte | 0:d5f38b9d7c7a | 442 | else if(strcmp("Clock", Command) == 0) |
Aganyte | 1:353c1902483f | 443 | Read_Clock(); // Clock |
Aganyte | 0:d5f38b9d7c7a | 444 | else if(strcmp("Tempe", Command) == 0) |
Aganyte | 1:353c1902483f | 445 | Read_Temperature(); // Temperature |
Aganyte | 0:d5f38b9d7c7a | 446 | else if(strcmp("Backu", Command) == 0) |
Aganyte | 1:353c1902483f | 447 | Read_Backup(); // pile de Backup |
Aganyte | 0:d5f38b9d7c7a | 448 | else if(strcmp("Setco", Command) == 0) |
Aganyte | 1:353c1902483f | 449 | Set_Color(); // changement des couleurs du mode monochrome |
Aganyte | 0:d5f38b9d7c7a | 450 | else if(strcmp("Verti", Command) == 0) |
Aganyte | 1:353c1902483f | 451 | Vertical_Scrolling_SD(); // Scrolling vertical depuis la SD |
Aganyte | 0:d5f38b9d7c7a | 452 | else if(strcmp("Horiz", Command) == 0) |
Aganyte | 1:353c1902483f | 453 | Horizontal_Scrolling_SD(); // Scrolling Horizontal depuis la SD |
Aganyte | 0:d5f38b9d7c7a | 454 | else if(strcmp("Image", Command) == 0) |
Aganyte | 1:353c1902483f | 455 | Image_SD(); // Image depuis la SD |
Aganyte | 0:d5f38b9d7c7a | 456 | else if(strcmp("Score", Command) == 0) |
Aganyte | 1:353c1902483f | 457 | Score_SD(); // Superposer une Image avec du texte depuis la SD (scores) |
Aganyte | 1:353c1902483f | 458 | else if(strcmp("Brigh", Command) == 0) |
Aganyte | 1:353c1902483f | 459 | Set_Brightness(); // Régler le niveau de brightness |
Aganyte | 0:d5f38b9d7c7a | 460 | else |
Aganyte | 0:d5f38b9d7c7a | 461 | pc.printf("Aucune Commande dans le fichier index.ini\n"); |
Aganyte | 0:d5f38b9d7c7a | 462 | } |