Version avec sortie ABCD sur même connecteur

Dependencies:   SDFileSystemDMA mbed

Fork of DmdFullRGB_0_1 by Christophe Girardot

Committer:
Aganyte
Date:
Sat Dec 02 12:27:01 2017 +0000
Revision:
0:d5f38b9d7c7a
Child:
1:353c1902483f
DMD-Clock 128x32 RGB version 0.1

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 0:d5f38b9d7c7a 6 #define SPI_CLOCK_HZ ( 25 * 1000000 ) // Vitesse de communication SPI 25 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 0:d5f38b9d7c7a 30 /* Fonction de lecture d'un fichier de donnée (les données lues son placées dans le buffer de lecture)
Aganyte 0:d5f38b9d7c7a 31 * Renvois le nombre de caractères lu, 0 si rien à lire
Aganyte 0:d5f38b9d7c7a 32 */
Aganyte 0:d5f38b9d7c7a 33 unsigned int read4KB()
Aganyte 0:d5f38b9d7c7a 34 {
Aganyte 0:d5f38b9d7c7a 35 unsigned int readed = 0;
Aganyte 0:d5f38b9d7c7a 36
Aganyte 0:d5f38b9d7c7a 37 if (file != NULL)
Aganyte 0:d5f38b9d7c7a 38 readed = file->read(Display_Ram, 4096);
Aganyte 0:d5f38b9d7c7a 39 else
Aganyte 0:d5f38b9d7c7a 40 pc.printf("Impossible de lire le fichier\n");
Aganyte 0:d5f38b9d7c7a 41
Aganyte 0:d5f38b9d7c7a 42 return(readed);
Aganyte 0:d5f38b9d7c7a 43 }
Aganyte 0:d5f38b9d7c7a 44
Aganyte 0:d5f38b9d7c7a 45 /* Fonction de lecture d'un fichier de donnée de scrolling (les données lues son placées dans le buffer du scrolling)
Aganyte 0:d5f38b9d7c7a 46 * Renvois le nombre de caractères lu, 0 si rien à lire
Aganyte 0:d5f38b9d7c7a 47 */
Aganyte 0:d5f38b9d7c7a 48 unsigned int read40KB()
Aganyte 0:d5f38b9d7c7a 49 {
Aganyte 0:d5f38b9d7c7a 50 unsigned int readed = 0;
Aganyte 0:d5f38b9d7c7a 51
Aganyte 0:d5f38b9d7c7a 52 if (file != NULL)
Aganyte 0:d5f38b9d7c7a 53 readed = file->read(Scrolling_Buffer, 40960);
Aganyte 0:d5f38b9d7c7a 54 else
Aganyte 0:d5f38b9d7c7a 55 pc.printf("Impossible de lire le fichier\n");
Aganyte 0:d5f38b9d7c7a 56
Aganyte 0:d5f38b9d7c7a 57 return(readed);
Aganyte 0:d5f38b9d7c7a 58 }
Aganyte 0:d5f38b9d7c7a 59
Aganyte 0:d5f38b9d7c7a 60 /* Fonction qui recherche un caractère dans le fichier index.txt
Aganyte 0:d5f38b9d7c7a 61 * ou revient au début si fin du fichier
Aganyte 0:d5f38b9d7c7a 62 */
Aganyte 0:d5f38b9d7c7a 63 void Search_Char(char ThisChar)
Aganyte 0:d5f38b9d7c7a 64 {
Aganyte 0:d5f38b9d7c7a 65 char Char[1];
Aganyte 0:d5f38b9d7c7a 66 if(Index==NULL)
Aganyte 0:d5f38b9d7c7a 67 Index = sd.open("index.TXT", O_RDONLY); // Si besoin, première ouverture du fichier index
Aganyte 0:d5f38b9d7c7a 68 while( Char[0] != ThisChar ) // Chercher le signe =
Aganyte 0:d5f38b9d7c7a 69 {
Aganyte 0:d5f38b9d7c7a 70 Index->read(Char, 1); // lire un caractère
Aganyte 0:d5f38b9d7c7a 71 if(Char[0] == '#')// si fin de fichier
Aganyte 0:d5f38b9d7c7a 72 {
Aganyte 0:d5f38b9d7c7a 73 pc.printf("Fin du fichier index.txt\n");
Aganyte 0:d5f38b9d7c7a 74 delete Index; // Fermer le fichier
Aganyte 0:d5f38b9d7c7a 75 Index = sd.open("index.TXT", O_RDONLY); // ré-ouvrir le fichier index
Aganyte 0:d5f38b9d7c7a 76 }
Aganyte 0:d5f38b9d7c7a 77 }
Aganyte 0:d5f38b9d7c7a 78 }
Aganyte 0:d5f38b9d7c7a 79
Aganyte 0:d5f38b9d7c7a 80 /* Fonction qui lit le fichier timestamp.txt
Aganyte 0:d5f38b9d7c7a 81 */
Aganyte 0:d5f38b9d7c7a 82 void Read_Timestamp()
Aganyte 0:d5f38b9d7c7a 83 {
Aganyte 0:d5f38b9d7c7a 84 unsigned char try_read = 0;
Aganyte 0:d5f38b9d7c7a 85 FileHandle* Timestamp;
Aganyte 0:d5f38b9d7c7a 86 while(1)
Aganyte 0:d5f38b9d7c7a 87 {
Aganyte 0:d5f38b9d7c7a 88 delete Timestamp;
Aganyte 0:d5f38b9d7c7a 89 Timestamp = sd.open("time.TXT", O_RDONLY); // ouverture du fichier timestamp.TXT
Aganyte 0:d5f38b9d7c7a 90 if(Timestamp != NULL)
Aganyte 0:d5f38b9d7c7a 91 {
Aganyte 0:d5f38b9d7c7a 92 pc.printf("Fichier time.txt ouvert\n");
Aganyte 0:d5f38b9d7c7a 93 break; // Si le fichier est bien ouvert, quitter
Aganyte 0:d5f38b9d7c7a 94 }
Aganyte 0:d5f38b9d7c7a 95 try_read++;
Aganyte 0:d5f38b9d7c7a 96 if(try_read > 10) { // Si le fichier n'est pas ouvert après 10 tentative quitter
Aganyte 0:d5f38b9d7c7a 97 pc.printf("Plus de 10 tentatives de lecture du fichier -> probleme sur le fichier time.txt\n");
Aganyte 0:d5f38b9d7c7a 98 break;
Aganyte 0:d5f38b9d7c7a 99 }
Aganyte 0:d5f38b9d7c7a 100 }
Aganyte 0:d5f38b9d7c7a 101
Aganyte 0:d5f38b9d7c7a 102 Timestamp->read(Line_Buffer, 10); // lire 16 caractères
Aganyte 0:d5f38b9d7c7a 103 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 104 pc.printf("lecture de %d dans le fichier time.TXT\n",Actual_timestamp);
Aganyte 0:d5f38b9d7c7a 105 Flush_ascii_buffer(Line_Buffer); // Vider le tampon
Aganyte 0:d5f38b9d7c7a 106 delete Timestamp; // Fermer le fichier
Aganyte 0:d5f38b9d7c7a 107 }
Aganyte 0:d5f38b9d7c7a 108
Aganyte 0:d5f38b9d7c7a 109 /* Fonction d'ouverture d'un fichier sur la carte SD
Aganyte 0:d5f38b9d7c7a 110 * avec 10 tentatives de lecture avant de déclarer un problème
Aganyte 0:d5f38b9d7c7a 111 */
Aganyte 0:d5f38b9d7c7a 112 void Try_Open_File()
Aganyte 0:d5f38b9d7c7a 113 {
Aganyte 0:d5f38b9d7c7a 114 unsigned char try_read = 0;
Aganyte 0:d5f38b9d7c7a 115 while(1)
Aganyte 0:d5f38b9d7c7a 116 {
Aganyte 0:d5f38b9d7c7a 117 delete file; // effacer l'objet file
Aganyte 0:d5f38b9d7c7a 118 file = sd.open(FileName, O_RDONLY);
Aganyte 0:d5f38b9d7c7a 119 if(file != NULL)
Aganyte 0:d5f38b9d7c7a 120 break; // Si le fichier est bien ouvert, quitter
Aganyte 0:d5f38b9d7c7a 121 try_read++;
Aganyte 0:d5f38b9d7c7a 122 if(try_read > 10) // Si le fichier n'est pas ouvert après 10 tentative quitter
Aganyte 0:d5f38b9d7c7a 123 {
Aganyte 0:d5f38b9d7c7a 124 pc.printf("Plus de 10 tentatives de lecture du fichier -> probleme sur le fichier\n");
Aganyte 0:d5f38b9d7c7a 125 break;
Aganyte 0:d5f38b9d7c7a 126 }
Aganyte 0:d5f38b9d7c7a 127 }
Aganyte 0:d5f38b9d7c7a 128 }
Aganyte 0:d5f38b9d7c7a 129
Aganyte 0:d5f38b9d7c7a 130 /* Fonction de lecture d'une animation présente sur la carte SD
Aganyte 0:d5f38b9d7c7a 131 * Attention, le nom du fichier à lire doit déjà être en mémoire
Aganyte 0:d5f38b9d7c7a 132 */
Aganyte 0:d5f38b9d7c7a 133 void Animation_SD()
Aganyte 0:d5f38b9d7c7a 134 {
Aganyte 0:d5f38b9d7c7a 135 for(unsigned char count = 0; count < Replay; count++) // Jouer l'animation en fonction du nombre de répétition
Aganyte 0:d5f38b9d7c7a 136 {
Aganyte 0:d5f38b9d7c7a 137 Try_Open_File(); // Essayer d'ouvrir le fichier
Aganyte 0:d5f38b9d7c7a 138 int readed = 0;
Aganyte 0:d5f38b9d7c7a 139 unsigned int image = 0;
Aganyte 0:d5f38b9d7c7a 140 while(1)
Aganyte 0:d5f38b9d7c7a 141 {
Aganyte 0:d5f38b9d7c7a 142 // Charger une trame dans la mémoire vidéo
Aganyte 0:d5f38b9d7c7a 143 readed = read4KB();
Aganyte 0:d5f38b9d7c7a 144 // détection de la fin de l'animation
Aganyte 0:d5f38b9d7c7a 145 if(readed == 0)
Aganyte 0:d5f38b9d7c7a 146 break;
Aganyte 0:d5f38b9d7c7a 147 // détection d'un problème de lecture
Aganyte 0:d5f38b9d7c7a 148 if(readed == -1)
Aganyte 0:d5f38b9d7c7a 149 {
Aganyte 0:d5f38b9d7c7a 150 pc.printf("Erreur de lecture du fichier %s apres %d image(s)\n",FileName,image);
Aganyte 0:d5f38b9d7c7a 151 break;
Aganyte 0:d5f38b9d7c7a 152 }
Aganyte 0:d5f38b9d7c7a 153 // Affichage de la trame avec gestion de la vitesse
Aganyte 0:d5f38b9d7c7a 154 for(unsigned char count = 0; count < (10-Speed); count++)
Aganyte 0:d5f38b9d7c7a 155 refresh();
Aganyte 0:d5f38b9d7c7a 156 // Incrémenter le compteur d'image
Aganyte 0:d5f38b9d7c7a 157 image++;
Aganyte 0:d5f38b9d7c7a 158 }
Aganyte 0:d5f38b9d7c7a 159 }
Aganyte 0:d5f38b9d7c7a 160 pc.printf("fin de l'animation %s\n\n",FileName);
Aganyte 0:d5f38b9d7c7a 161 }
Aganyte 0:d5f38b9d7c7a 162
Aganyte 0:d5f38b9d7c7a 163 /* Fonction de lecture d'une commande d'animation dans le fichier Index.txt
Aganyte 0:d5f38b9d7c7a 164 *
Aganyte 0:d5f38b9d7c7a 165 * Exemple d'utilisation:
Aganyte 0:d5f38b9d7c7a 166 *
Aganyte 0:d5f38b9d7c7a 167 * >Animation FileName=test0000.BIN Repeat=2 Speed=8
Aganyte 0:d5f38b9d7c7a 168 */
Aganyte 0:d5f38b9d7c7a 169 void Read_Animation()
Aganyte 0:d5f38b9d7c7a 170 {
Aganyte 0:d5f38b9d7c7a 171 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 172 Index->read(FileName, 12); // lire le nom de fichier
Aganyte 0:d5f38b9d7c7a 173
Aganyte 0:d5f38b9d7c7a 174 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 175 Index->read(Character, 1); // Lire le nombre de répétition
Aganyte 0:d5f38b9d7c7a 176 Replay = Character[0]-'0'; // Stocker le nombre de lecture à effectuer
Aganyte 0:d5f38b9d7c7a 177
Aganyte 0:d5f38b9d7c7a 178 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 179 Index->read(Character, 1); // Lire la vitesse de lecture
Aganyte 0:d5f38b9d7c7a 180 Speed = Character[0]-'0'; // stocker la vitesse de lecture
Aganyte 0:d5f38b9d7c7a 181
Aganyte 0:d5f38b9d7c7a 182 // affichage dans la console
Aganyte 0:d5f38b9d7c7a 183 pc.printf("Lecture de %s\n",FileName);
Aganyte 0:d5f38b9d7c7a 184 pc.printf("Nombre de repetition du fichier : %d\n",Replay);
Aganyte 0:d5f38b9d7c7a 185 pc.printf("Vitesse de lecture : %d\n",Speed);
Aganyte 0:d5f38b9d7c7a 186
Aganyte 0:d5f38b9d7c7a 187 Animation_SD(); // Lancer l'animation
Aganyte 0:d5f38b9d7c7a 188 }
Aganyte 0:d5f38b9d7c7a 189
Aganyte 0:d5f38b9d7c7a 190 /* Fonction de lecture d'une commande Image dans le fichier Index.txt
Aganyte 0:d5f38b9d7c7a 191 *
Aganyte 0:d5f38b9d7c7a 192 * Exemple d'utilisation:
Aganyte 0:d5f38b9d7c7a 193 *
Aganyte 0:d5f38b9d7c7a 194 * >Animation FileName=test0000.BIN time=2
Aganyte 0:d5f38b9d7c7a 195 */
Aganyte 0:d5f38b9d7c7a 196 void Image_SD()
Aganyte 0:d5f38b9d7c7a 197 {
Aganyte 0:d5f38b9d7c7a 198 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 199 Index->read(FileName, 12); // lire le nom de fichier
Aganyte 0:d5f38b9d7c7a 200
Aganyte 0:d5f38b9d7c7a 201 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 202 Index->read(Character, 1); // Lire le nombre de répétition
Aganyte 0:d5f38b9d7c7a 203 Sleep = Character[0]-'0'; // Stocker le temps de lecture
Aganyte 0:d5f38b9d7c7a 204
Aganyte 0:d5f38b9d7c7a 205 // affichage dans la console
Aganyte 0:d5f38b9d7c7a 206 pc.printf("Affichage de l'image %s pendant %d secondes\n\n",FileName,Sleep);
Aganyte 0:d5f38b9d7c7a 207
Aganyte 0:d5f38b9d7c7a 208 Try_Open_File(); // Essayer d'ouvrir le fichier
Aganyte 0:d5f38b9d7c7a 209
Aganyte 0:d5f38b9d7c7a 210 read4KB(); // Charger une trame dans la mémoire vidéo RGB
Aganyte 0:d5f38b9d7c7a 211
Aganyte 0:d5f38b9d7c7a 212 Image(Sleep); // Afficher l'image
Aganyte 0:d5f38b9d7c7a 213 }
Aganyte 0:d5f38b9d7c7a 214
Aganyte 0:d5f38b9d7c7a 215 /* Fonction de lecture d'une commande de texte dans le fichier Index.txt
Aganyte 0:d5f38b9d7c7a 216 *
Aganyte 0:d5f38b9d7c7a 217 * Exemple d'utilisation:
Aganyte 0:d5f38b9d7c7a 218 *
Aganyte 0:d5f38b9d7c7a 219 * >Write Temp=5 L1=XXXXXXXXXXXXXXXX L2=XXXXXXXXXXXXXXXX L3=XXXXXXXXXXXXXXXX L4=XXXXXXXXXXXXXXXX
Aganyte 0:d5f38b9d7c7a 220 */
Aganyte 0:d5f38b9d7c7a 221 void Read_Text()
Aganyte 0:d5f38b9d7c7a 222 {
Aganyte 0:d5f38b9d7c7a 223 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 224 Index->read(Character, 1); // Lire le nombre de répétition
Aganyte 0:d5f38b9d7c7a 225 Sleep = Character[0]-'0'; // Stocker le temps d'affichage
Aganyte 0:d5f38b9d7c7a 226
Aganyte 0:d5f38b9d7c7a 227 pc.printf("Affichage d'un texte pendant %d secondes\n",Sleep); // affichage dans la console
Aganyte 0:d5f38b9d7c7a 228
Aganyte 0:d5f38b9d7c7a 229 // Placer les 4 lignes dans le buffer vidéo monochrome
Aganyte 0:d5f38b9d7c7a 230 for(unsigned char count = 1; count<5; count++)
Aganyte 0:d5f38b9d7c7a 231 {
Aganyte 0:d5f38b9d7c7a 232 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 233 Index->read(Line_Buffer, 16); // lire la ligne
Aganyte 0:d5f38b9d7c7a 234 print_4_16(Line_Buffer,count); // Ecrire la ligne dans le buffer vidéo monochrome
Aganyte 0:d5f38b9d7c7a 235 pc.printf("Ligne %d = %s\n",count,Line_Buffer); // affichage dans la console
Aganyte 0:d5f38b9d7c7a 236 }
Aganyte 0:d5f38b9d7c7a 237 pc.printf("\n");
Aganyte 0:d5f38b9d7c7a 238 Refresh_in_seconds(); // Rafraichir l'écran pendant x secondes
Aganyte 0:d5f38b9d7c7a 239 }
Aganyte 0:d5f38b9d7c7a 240
Aganyte 0:d5f38b9d7c7a 241 /* Fonction de lecture d'une commande qui superpose une image et du texte dans le fichier Index.txt
Aganyte 0:d5f38b9d7c7a 242 *
Aganyte 0:d5f38b9d7c7a 243 * Exemple d'utilisation:
Aganyte 0:d5f38b9d7c7a 244 *
Aganyte 0:d5f38b9d7c7a 245 * >Score FileName=test0000.BIN Temp=5 L1=XXXXXXXXXXXXXXXX L2=XXXXXXXXXXXXXXXX L3=XXXXXXXXXXXXXXXX L4=XXXXXXXXXXXXXXXX
Aganyte 0:d5f38b9d7c7a 246 */
Aganyte 0:d5f38b9d7c7a 247 void Score_SD()
Aganyte 0:d5f38b9d7c7a 248 {
Aganyte 0:d5f38b9d7c7a 249 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 250 Index->read(FileName, 12); // lire le nom de fichier
Aganyte 0:d5f38b9d7c7a 251
Aganyte 0:d5f38b9d7c7a 252 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 253 Index->read(Character, 1); // Lire le nombre de répétition
Aganyte 0:d5f38b9d7c7a 254 Sleep = Character[0]-'0'; // Stocker le temps d'affichage
Aganyte 0:d5f38b9d7c7a 255
Aganyte 0:d5f38b9d7c7a 256 pc.printf("Affichage d'un score pendant %d secondes\n",Sleep); // affichage dans la console
Aganyte 0:d5f38b9d7c7a 257
Aganyte 0:d5f38b9d7c7a 258 // Placer les 4 lignes dans le buffer vidéo monochrome
Aganyte 0:d5f38b9d7c7a 259 for(unsigned char count = 1; count<5; count++)
Aganyte 0:d5f38b9d7c7a 260 {
Aganyte 0:d5f38b9d7c7a 261 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 262 Index->read(Line_Buffer, 16); // lire la ligne
Aganyte 0:d5f38b9d7c7a 263 print_4_16(Line_Buffer,count); // Ecrire la ligne dans le buffer vidéo monochrome
Aganyte 0:d5f38b9d7c7a 264 pc.printf("Ligne %d = %s\n",count,Line_Buffer); // affichage dans la console
Aganyte 0:d5f38b9d7c7a 265 }
Aganyte 0:d5f38b9d7c7a 266 pc.printf("\n");
Aganyte 0:d5f38b9d7c7a 267 Try_Open_File(); // Essayer d'ouvrir le fichier
Aganyte 0:d5f38b9d7c7a 268
Aganyte 0:d5f38b9d7c7a 269 read4KB(); // Charger une trame dans la mémoire vidéo RGB
Aganyte 0:d5f38b9d7c7a 270
Aganyte 0:d5f38b9d7c7a 271 Convert_Mono_To_RGB(); // Convertir le buffer mono avec superposition dans le buffer couleur
Aganyte 0:d5f38b9d7c7a 272
Aganyte 0:d5f38b9d7c7a 273 Image(Sleep); // Afficher l'image
Aganyte 0:d5f38b9d7c7a 274
Aganyte 0:d5f38b9d7c7a 275 //Refresh_in_seconds();
Aganyte 0:d5f38b9d7c7a 276 }
Aganyte 0:d5f38b9d7c7a 277
Aganyte 0:d5f38b9d7c7a 278 /* Fonction de lecture d'une commande de réglage des couleurs
Aganyte 0:d5f38b9d7c7a 279 *
Aganyte 0:d5f38b9d7c7a 280 * Exemple d'utilisation:
Aganyte 0:d5f38b9d7c7a 281 *
Aganyte 0:d5f38b9d7c7a 282 * >SetColor R=1 G=0 B=0
Aganyte 0:d5f38b9d7c7a 283 */
Aganyte 0:d5f38b9d7c7a 284 void Set_Color()
Aganyte 0:d5f38b9d7c7a 285 {
Aganyte 0:d5f38b9d7c7a 286 unsigned char CR;
Aganyte 0:d5f38b9d7c7a 287 unsigned char CG;
Aganyte 0:d5f38b9d7c7a 288 unsigned char CB;
Aganyte 0:d5f38b9d7c7a 289
Aganyte 0:d5f38b9d7c7a 290 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 291 Index->read(Character, 1); // Lire le nombre de répétition
Aganyte 0:d5f38b9d7c7a 292 CR = Character[0]-'0'; // stocker la valeur de la couleur rouge
Aganyte 0:d5f38b9d7c7a 293
Aganyte 0:d5f38b9d7c7a 294 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 295 Index->read(Character, 1); // Lire le nombre de répétition
Aganyte 0:d5f38b9d7c7a 296 CG = Character[0]-'0'; // stocker la valeur de la couleur vert
Aganyte 0:d5f38b9d7c7a 297
Aganyte 0:d5f38b9d7c7a 298 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 299 Index->read(Character, 1); // Lire le nombre de répétition
Aganyte 0:d5f38b9d7c7a 300 CB = Character[0]-'0'; // stocker la valeur de la couleur bleu
Aganyte 0:d5f38b9d7c7a 301
Aganyte 0:d5f38b9d7c7a 302 pc.printf("Reglages des couleurs du mode monochrome avec R=%d,G=%d,B=%d\n\n",CR,CG,CB); // affichage dans la console
Aganyte 0:d5f38b9d7c7a 303 Color_R = CR;
Aganyte 0:d5f38b9d7c7a 304 Color_B = CB;
Aganyte 0:d5f38b9d7c7a 305 Color_G = CG;
Aganyte 0:d5f38b9d7c7a 306 }
Aganyte 0:d5f38b9d7c7a 307
Aganyte 0:d5f38b9d7c7a 308 /* Fonction de lecture d'une commande horloge
Aganyte 0:d5f38b9d7c7a 309 *
Aganyte 0:d5f38b9d7c7a 310 * Exemple d'utilisation:
Aganyte 0:d5f38b9d7c7a 311 *
Aganyte 0:d5f38b9d7c7a 312 * >Clock Temp=5
Aganyte 0:d5f38b9d7c7a 313 */
Aganyte 0:d5f38b9d7c7a 314 void Read_Clock()
Aganyte 0:d5f38b9d7c7a 315 {
Aganyte 0:d5f38b9d7c7a 316 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 317 Index->read(Character, 1); // Lire le nombre de répétition
Aganyte 0:d5f38b9d7c7a 318 Sleep = Character[0]-'0'; // Stocker le temps d'affichage
Aganyte 0:d5f38b9d7c7a 319
Aganyte 0:d5f38b9d7c7a 320 pc.printf("Affichage de l'heure pendant %d secondes\n\n",Sleep); // affichage dans la console
Aganyte 0:d5f38b9d7c7a 321
Aganyte 0:d5f38b9d7c7a 322 Clock();
Aganyte 0:d5f38b9d7c7a 323 }
Aganyte 0:d5f38b9d7c7a 324
Aganyte 0:d5f38b9d7c7a 325 /* Fonction de lecture d'une commande temperature
Aganyte 0:d5f38b9d7c7a 326 *
Aganyte 0:d5f38b9d7c7a 327 * Exemple d'utilisation:
Aganyte 0:d5f38b9d7c7a 328 *
Aganyte 0:d5f38b9d7c7a 329 * >Temperature Temp=5
Aganyte 0:d5f38b9d7c7a 330 */
Aganyte 0:d5f38b9d7c7a 331 void Read_Temperature()
Aganyte 0:d5f38b9d7c7a 332 {
Aganyte 0:d5f38b9d7c7a 333 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 334 Index->read(Character, 1); // Lire le nombre de répétition
Aganyte 0:d5f38b9d7c7a 335 Sleep = Character[0]-'0'; // Stocker le temps d'affichage
Aganyte 0:d5f38b9d7c7a 336
Aganyte 0:d5f38b9d7c7a 337 pc.printf("Affichage de la temperature pendant %d secondes\n\n",Sleep); // affichage dans la console
Aganyte 0:d5f38b9d7c7a 338
Aganyte 0:d5f38b9d7c7a 339 Temperature();
Aganyte 0:d5f38b9d7c7a 340 }
Aganyte 0:d5f38b9d7c7a 341
Aganyte 0:d5f38b9d7c7a 342
Aganyte 0:d5f38b9d7c7a 343 /* Fonction de lecture d'une commande lecture de la pile de backup
Aganyte 0:d5f38b9d7c7a 344 *
Aganyte 0:d5f38b9d7c7a 345 * Exemple d'utilisation:
Aganyte 0:d5f38b9d7c7a 346 *
Aganyte 0:d5f38b9d7c7a 347 * >Battery Temp=5
Aganyte 0:d5f38b9d7c7a 348 */
Aganyte 0:d5f38b9d7c7a 349 void Read_Backup()
Aganyte 0:d5f38b9d7c7a 350 {
Aganyte 0:d5f38b9d7c7a 351 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 352 Index->read(Character, 1); // Lire le nombre de répétition
Aganyte 0:d5f38b9d7c7a 353 Sleep = Character[0]-'0'; // Stocker le temps d'affichage
Aganyte 0:d5f38b9d7c7a 354
Aganyte 0:d5f38b9d7c7a 355 pc.printf("Affichage de la tension de la batterie pendant %d secondes\n\n",Sleep); // affichage dans la console
Aganyte 0:d5f38b9d7c7a 356
Aganyte 0:d5f38b9d7c7a 357 Backup();
Aganyte 0:d5f38b9d7c7a 358 }
Aganyte 0:d5f38b9d7c7a 359
Aganyte 0:d5f38b9d7c7a 360 /* Fonction de lecture d'une commande de scrolling vertical dans le fichier Index.txt
Aganyte 0:d5f38b9d7c7a 361 * ATTENTION => La hauteur est à remplir sur 3 digits (max 320 pixels de haut)
Aganyte 0:d5f38b9d7c7a 362 * Exemple d'utilisation:
Aganyte 0:d5f38b9d7c7a 363 *
Aganyte 0:d5f38b9d7c7a 364 * >Vertical FileName=test0000.BIN height=128 Speed=8 Up=1
Aganyte 0:d5f38b9d7c7a 365 */
Aganyte 0:d5f38b9d7c7a 366 void Vertical_Scrolling_SD()
Aganyte 0:d5f38b9d7c7a 367 {
Aganyte 0:d5f38b9d7c7a 368 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 369 Index->read(FileName, 12); // lire le nom de fichier
Aganyte 0:d5f38b9d7c7a 370
Aganyte 0:d5f38b9d7c7a 371 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 372 Index->read(Line_Buffer, 3); // lire 16 caractères
Aganyte 0:d5f38b9d7c7a 373 unsigned int height = atoi(Line_Buffer); // Convertion de la valeur de Ascii vers un entier
Aganyte 0:d5f38b9d7c7a 374
Aganyte 0:d5f38b9d7c7a 375 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 376 Index->read(Character, 1); // Lire la vitesse de lecture
Aganyte 0:d5f38b9d7c7a 377 Speed = Character[0]-'0'; // stocker la vitesse de lecture
Aganyte 0:d5f38b9d7c7a 378
Aganyte 0:d5f38b9d7c7a 379 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 380 Index->read(Character, 1); // Lire le sens de lecture
Aganyte 0:d5f38b9d7c7a 381 Up = Character[0]-'0'; // stocker le sens de lecture
Aganyte 0:d5f38b9d7c7a 382
Aganyte 0:d5f38b9d7c7a 383 Try_Open_File(); // Ouvrir le fichier
Aganyte 0:d5f38b9d7c7a 384
Aganyte 0:d5f38b9d7c7a 385 read40KB(); // Charger le scrolling dans la mémoire
Aganyte 0:d5f38b9d7c7a 386
Aganyte 0:d5f38b9d7c7a 387 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 388
Aganyte 0:d5f38b9d7c7a 389 if(Up!=1)
Aganyte 0:d5f38b9d7c7a 390 {
Aganyte 0:d5f38b9d7c7a 391 for(unsigned char decal = 0; decal<(height-32); decal++) {
Aganyte 0:d5f38b9d7c7a 392 // Remplir la mémoire vidéo avec une image
Aganyte 0:d5f38b9d7c7a 393 for(unsigned int count = 0; count<4096; count++)
Aganyte 0:d5f38b9d7c7a 394 Display_Ram[count] = Scrolling_Buffer[(decal*128)+count];
Aganyte 0:d5f38b9d7c7a 395 // Affichage de la trame avec gestion de la vitesse
Aganyte 0:d5f38b9d7c7a 396 for(unsigned char count = 0; count < (10-Speed); count++)
Aganyte 0:d5f38b9d7c7a 397 refresh();
Aganyte 0:d5f38b9d7c7a 398 }
Aganyte 0:d5f38b9d7c7a 399 }
Aganyte 0:d5f38b9d7c7a 400 else
Aganyte 0:d5f38b9d7c7a 401 {
Aganyte 0:d5f38b9d7c7a 402
Aganyte 0:d5f38b9d7c7a 403 for(unsigned char decal = (height-32); decal!=0; decal--) {
Aganyte 0:d5f38b9d7c7a 404 // Remplir la mémoire vidéo avec une image
Aganyte 0:d5f38b9d7c7a 405 for(unsigned int count = 0; count<4096; count++)
Aganyte 0:d5f38b9d7c7a 406 Display_Ram[count] = Scrolling_Buffer[(decal*128)+count];
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 0:d5f38b9d7c7a 415 /* Fonction de lecture d'une commande de scrolling horizontal dans le fichier Index.txt
Aganyte 0:d5f38b9d7c7a 416 * ATTENTION => La hauteur est à remplir sur 4 digits (max 1280 pixels de large)
Aganyte 0:d5f38b9d7c7a 417 * Exemple d'utilisation:
Aganyte 0:d5f38b9d7c7a 418 *
Aganyte 0:d5f38b9d7c7a 419 * >Horizontal FileName=test0000.BIN height=0128 Speed=8
Aganyte 0:d5f38b9d7c7a 420 */
Aganyte 0:d5f38b9d7c7a 421 void Horizontal_Scrolling_SD()
Aganyte 0:d5f38b9d7c7a 422 {
Aganyte 0:d5f38b9d7c7a 423 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 424 Index->read(FileName, 12); // lire le nom de fichier
Aganyte 0:d5f38b9d7c7a 425
Aganyte 0:d5f38b9d7c7a 426 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 427 Index->read(Line_Buffer, 4); // lire 16 caractères
Aganyte 0:d5f38b9d7c7a 428 unsigned int width = atoi(Line_Buffer); // Convertion de la valeur de Ascii vers un entier
Aganyte 0:d5f38b9d7c7a 429
Aganyte 0:d5f38b9d7c7a 430 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 431 Index->read(Character, 1); // Lire la vitesse de lecture
Aganyte 0:d5f38b9d7c7a 432 Speed = Character[0]-'0'; // stocker la vitesse de lecture
Aganyte 0:d5f38b9d7c7a 433
Aganyte 0:d5f38b9d7c7a 434 Search_Char('='); // lire jusqu'au prochain =
Aganyte 0:d5f38b9d7c7a 435 Index->read(Character, 1); // Lire le sens de lecture
Aganyte 0:d5f38b9d7c7a 436 Left = Character[0]-'0'; // stocker le sens de lecture
Aganyte 0:d5f38b9d7c7a 437
Aganyte 0:d5f38b9d7c7a 438 Try_Open_File(); // Ouvrir le fichier
Aganyte 0:d5f38b9d7c7a 439
Aganyte 0:d5f38b9d7c7a 440 read40KB(); // Charger le scrolling dans la mémoire
Aganyte 0:d5f38b9d7c7a 441
Aganyte 0:d5f38b9d7c7a 442 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 443
Aganyte 0:d5f38b9d7c7a 444 if(Left==1)
Aganyte 0:d5f38b9d7c7a 445 {
Aganyte 0:d5f38b9d7c7a 446 for(unsigned int image = 0 ; image < width-128; image++) {
Aganyte 0:d5f38b9d7c7a 447 // Remplir la mémoire vidéo avec une ligne
Aganyte 0:d5f38b9d7c7a 448 for(unsigned char ligne = 0; ligne<32; ligne++) {
Aganyte 0:d5f38b9d7c7a 449 for(unsigned char count = 0 ; count<128 ; count++)
Aganyte 0:d5f38b9d7c7a 450 Display_Ram[count+(ligne*128)] = Scrolling_Buffer[image+count+(width*ligne)];
Aganyte 0:d5f38b9d7c7a 451 }
Aganyte 0:d5f38b9d7c7a 452 // Affichage de la trame avec gestion de la vitesse
Aganyte 0:d5f38b9d7c7a 453 for(unsigned char count = 0; count < (10-Speed); count++)
Aganyte 0:d5f38b9d7c7a 454 refresh();
Aganyte 0:d5f38b9d7c7a 455 }
Aganyte 0:d5f38b9d7c7a 456 }
Aganyte 0:d5f38b9d7c7a 457 else
Aganyte 0:d5f38b9d7c7a 458 {
Aganyte 0:d5f38b9d7c7a 459 for(unsigned int image = width-128 ; image !=0 ; image--) {
Aganyte 0:d5f38b9d7c7a 460 // Remplir la mémoire vidéo avec une ligne
Aganyte 0:d5f38b9d7c7a 461 for(unsigned char ligne = 0; ligne<32; ligne++) {
Aganyte 0:d5f38b9d7c7a 462 for(unsigned char count = 0 ; count<128 ; count++)
Aganyte 0:d5f38b9d7c7a 463 Display_Ram[count+(ligne*128)] = Scrolling_Buffer[image+count+(width*ligne)];
Aganyte 0:d5f38b9d7c7a 464 }
Aganyte 0:d5f38b9d7c7a 465 // Affichage de la trame avec gestion de la vitesse
Aganyte 0:d5f38b9d7c7a 466 for(unsigned char count = 0; count < (10-Speed); count++)
Aganyte 0:d5f38b9d7c7a 467 refresh();
Aganyte 0:d5f38b9d7c7a 468 }
Aganyte 0:d5f38b9d7c7a 469 }
Aganyte 0:d5f38b9d7c7a 470 Flush_ascii_buffer(Line_Buffer);
Aganyte 0:d5f38b9d7c7a 471 }
Aganyte 0:d5f38b9d7c7a 472
Aganyte 0:d5f38b9d7c7a 473 /* Lire et effectuer la prochaine commade du fichier index.txt */
Aganyte 0:d5f38b9d7c7a 474 void Read_Next_Command()
Aganyte 0:d5f38b9d7c7a 475 {
Aganyte 0:d5f38b9d7c7a 476 Search_Char('>'); // Chercher le prochain début de commande
Aganyte 0:d5f38b9d7c7a 477 Index->read(Command, 5); // lire la commande
Aganyte 0:d5f38b9d7c7a 478
Aganyte 0:d5f38b9d7c7a 479 if( strcmp("Anima", Command) == 0) // A => Animation
Aganyte 0:d5f38b9d7c7a 480 Read_Animation();
Aganyte 0:d5f38b9d7c7a 481 else if(strcmp("Write", Command) == 0) // W => Write
Aganyte 0:d5f38b9d7c7a 482 Read_Text();
Aganyte 0:d5f38b9d7c7a 483 else if(strcmp("Clock", Command) == 0)
Aganyte 0:d5f38b9d7c7a 484 Read_Clock(); // C => Clock
Aganyte 0:d5f38b9d7c7a 485 else if(strcmp("Tempe", Command) == 0)
Aganyte 0:d5f38b9d7c7a 486 Read_Temperature(); // T => Temperature
Aganyte 0:d5f38b9d7c7a 487 else if(strcmp("Backu", Command) == 0)
Aganyte 0:d5f38b9d7c7a 488 Read_Backup(); // B => pile de Backup
Aganyte 0:d5f38b9d7c7a 489 else if(strcmp("Setco", Command) == 0)
Aganyte 0:d5f38b9d7c7a 490 Set_Color(); // S => changement des couleurs du mode monochrome
Aganyte 0:d5f38b9d7c7a 491 else if(strcmp("Verti", Command) == 0)
Aganyte 0:d5f38b9d7c7a 492 Vertical_Scrolling_SD(); // V => Scrolling vertical depuis la SD
Aganyte 0:d5f38b9d7c7a 493 else if(strcmp("Horiz", Command) == 0)
Aganyte 0:d5f38b9d7c7a 494 Horizontal_Scrolling_SD(); // H => Scrolling Horizontal depuis la SD
Aganyte 0:d5f38b9d7c7a 495 else if(strcmp("Image", Command) == 0)
Aganyte 0:d5f38b9d7c7a 496 Image_SD(); // I => Image depuis la SD
Aganyte 0:d5f38b9d7c7a 497 else if(strcmp("Score", Command) == 0)
Aganyte 0:d5f38b9d7c7a 498 Score_SD(); // I => Superposer une Image avec du texte depuis la SD (scores)
Aganyte 0:d5f38b9d7c7a 499 else
Aganyte 0:d5f38b9d7c7a 500 pc.printf("Aucune Commande dans le fichier index.ini\n");
Aganyte 0:d5f38b9d7c7a 501 }