Version avec sortie ABCD sur même connecteur

Dependencies:   SDFileSystemDMA mbed

Fork of DmdFullRGB_0_1 by Christophe Girardot

Committer:
IroCorp
Date:
Wed Dec 13 22:04:26 2017 +0000
Revision:
3:5fc29520dff0
Parent:
2:2f5b7e5faf83
configuration.h : Changement sortie C (A0) pour D2 - Iro 13/12/17 23h04

Who changed what in which revision?

UserRevisionLine numberNew 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 }