Version avec sortie ABCD sur même connecteur

Dependencies:   SDFileSystemDMA mbed

Fork of DmdFullRGB_0_1 by Christophe Girardot

Revision:
1:353c1902483f
Parent:
0:d5f38b9d7c7a
Child:
2:2f5b7e5faf83
--- a/SD.h	Sat Dec 02 12:27:01 2017 +0000
+++ b/SD.h	Sun Dec 03 17:24:56 2017 +0000
@@ -3,7 +3,7 @@
 *   decembre 2017 par Christophe Girardot Aka Aganyte
 */
 
-#define SPI_CLOCK_HZ    ( 25 * 1000000 ) // Vitesse de communication SPI 25 MHz
+#define SPI_CLOCK_HZ    ( 40 * 1000000 ) // Vitesse de communication SPI 40 MHz
 
 SDFileSystem sd(MOSI, MISO, SCLK, CS, "sd", SPI_CLOCK_HZ); // Ouverture de la liaison SPI
 
@@ -27,33 +27,14 @@
     }
 }
 
-/* Fonction de lecture d'un fichier de donnée (les données lues son placées dans le buffer de lecture) 
+/* Fonction de lecture d'un fichier de donnée (les données lues son placées dans le buffer donné en argument)
+*  Le nombre de kilo-octet à lire est donné en argument 
 *  Renvois le nombre de caractères lu, 0 si rien à lire
 */
-unsigned int read4KB()
+unsigned int readKB(unsigned char *Destination, unsigned char KB)
 {
-    unsigned int readed = 0;
-    
-    if (file != NULL) 
-        readed = file->read(Display_Ram, 4096);
-    else
-        pc.printf("Impossible de lire le fichier\n");
-            
-    return(readed);
-}
-
-/* Fonction de lecture d'un fichier de donnée de scrolling (les données lues son placées dans le buffer du scrolling) 
-*  Renvois le nombre de caractères lu, 0 si rien à lire
-*/
-unsigned int read40KB()
-{
-    unsigned int readed = 0;
-    
-    if (file != NULL) 
-        readed = file->read(Scrolling_Buffer, 40960);
-    else
-        pc.printf("Impossible de lire le fichier\n");
-            
+    unsigned int readed = 0; 
+    readed = file->read(Destination, KB*1024);   
     return(readed);
 }
 
@@ -77,6 +58,23 @@
     }
 }
 
+/* Fonction qui cherche et lit un nombre après un symbole donné
+*  ne change pas la valeur si trouve rien
+*/
+char Search_Read_Char(char ThisChar, char Result) // Result => valeur d'origine
+{
+    char Buffer[1];
+    Search_Char(ThisChar);  // lire jusqu'au prochain caractère donné
+    Index->read(Buffer, 1); // Lire le nombre
+    if( (Buffer[0]-'0' >= 0) & (Buffer[0]-'0' <= 9) ) //Accépter seulement les nombres de 0 à 9
+        return (Buffer[0]-'0'); // renvoyer le nouveau nombre
+    else
+    {
+        pc.printf("Erreur sur ce parametre : %d\n",Buffer[0]-'0');
+        return(Result); // ou renvoyer l'ancien
+    }
+}
+
 /* Fonction qui lit le fichier timestamp.txt
 */
 void Read_Timestamp()
@@ -85,7 +83,6 @@
     FileHandle* Timestamp;
     while(1)
     {
-        delete Timestamp;
         Timestamp = sd.open("time.TXT", O_RDONLY); // ouverture du fichier timestamp.TXT
         if(Timestamp != NULL)
         {
@@ -135,26 +132,14 @@
     for(unsigned char count = 0; count < Replay; count++) // Jouer l'animation en fonction du nombre de répétition
     {
         Try_Open_File();    // Essayer d'ouvrir le fichier
-        int readed = 0;
-        unsigned int image = 0;
         while(1) 
         {
-            // Charger une trame dans la mémoire vidéo
-            readed = read4KB();
-            // détection de la fin de l'animation
-            if(readed == 0) 
+            // lecture d'une trame avec détection de la fin de l'animation
+            if(readKB(Display_Ram,4) == 0) 
                 break;
-            // détection d'un problème de lecture
-            if(readed == -1) 
-            {
-                pc.printf("Erreur de lecture du fichier %s apres %d image(s)\n",FileName,image);
-                break;
-            }
             // Affichage de la trame avec gestion de la vitesse
             for(unsigned char count = 0; count < (10-Speed); count++)
                 refresh();
-            // Incrémenter le compteur d'image
-            image++;
         }
     }
     pc.printf("fin de l'animation %s\n\n",FileName);
@@ -171,13 +156,9 @@
     Search_Char('='); // lire jusqu'au prochain =
     Index->read(FileName, 12); // lire le nom de fichier
 
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire le nombre de répétition
-    Replay = Character[0]-'0'; // Stocker le nombre de lecture à effectuer
-
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire la vitesse de lecture
-    Speed = Character[0]-'0';  // stocker la vitesse de lecture
+    Replay = Search_Read_Char('=',Replay);
+    
+    Speed = Search_Read_Char('=',Speed);
     
     // affichage dans la console
     pc.printf("Lecture de %s\n",FileName);
@@ -198,16 +179,14 @@
     Search_Char('='); // lire jusqu'au prochain =
     Index->read(FileName, 12); // lire le nom de fichier
 
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire le nombre de répétition
-    Sleep = Character[0]-'0'; // Stocker le temps de lecture
+    Sleep = Search_Read_Char('=',Sleep);
 
     // affichage dans la console
     pc.printf("Affichage de l'image %s pendant %d secondes\n\n",FileName,Sleep);
  
     Try_Open_File();    // Essayer d'ouvrir le fichier
     
-    read4KB(); // Charger une trame dans la mémoire vidéo RGB
+    readKB(Display_Ram,4); // Charger une trame dans la mémoire vidéo RGB
     
     Image(Sleep); // Afficher l'image
 }
@@ -219,10 +198,8 @@
 *  >Write Temp=5 L1=XXXXXXXXXXXXXXXX L2=XXXXXXXXXXXXXXXX L3=XXXXXXXXXXXXXXXX L4=XXXXXXXXXXXXXXXX
 */
 void Read_Text()
-{
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire le nombre de répétition
-    Sleep = Character[0]-'0'; // Stocker le temps d'affichage
+{    
+    Sleep = Search_Read_Char('=',Sleep);
  
     pc.printf("Affichage d'un texte pendant %d secondes\n",Sleep); // affichage dans la console
  
@@ -249,10 +226,8 @@
     Search_Char('='); // lire jusqu'au prochain =
     Index->read(FileName, 12); // lire le nom de fichier
     
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire le nombre de répétition
-    Sleep = Character[0]-'0'; // Stocker le temps d'affichage
- 
+    Sleep = Search_Read_Char('=',Sleep);
+
     pc.printf("Affichage d'un score pendant %d secondes\n",Sleep); // affichage dans la console
  
     // Placer les 4 lignes dans le buffer vidéo monochrome
@@ -266,13 +241,11 @@
     pc.printf("\n");
     Try_Open_File();    // Essayer d'ouvrir le fichier
     
-    read4KB(); // Charger une trame dans la mémoire vidéo RGB
+    readKB(Display_Ram,4); // Charger une trame dans la mémoire vidéo RGB
     
-    Convert_Mono_To_RGB(); // Convertir le buffer mono avec superposition dans le buffer couleur
+    Convert_Bool_To_RGB(); // Convertir le buffer mono avec superposition dans le buffer couleur
     
     Image(Sleep); // Afficher l'image
-    
-    //Refresh_in_seconds();
 }
 
 /* Fonction de lecture d'une commande de réglage des couleurs
@@ -283,26 +256,11 @@
 */
 void Set_Color()
 {
-    unsigned char CR;
-    unsigned char CG;
-    unsigned char CB;
-    
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire le nombre de répétition
-    CR = Character[0]-'0';  // stocker la valeur de la couleur rouge
+    Color_R = Search_Read_Char('=',Color_R);
+    Color_B = Search_Read_Char('=',Color_G);
+    Color_G = Search_Read_Char('=',Color_B);
     
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire le nombre de répétition
-    CG = Character[0]-'0';  // stocker la valeur de la couleur vert
-    
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire le nombre de répétition
-    CB = Character[0]-'0';  // stocker la valeur de la couleur bleu
-    
-    pc.printf("Reglages des couleurs du mode monochrome avec R=%d,G=%d,B=%d\n\n",CR,CG,CB); // affichage dans la console
-    Color_R = CR;
-    Color_B = CB;
-    Color_G = CG;
+    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
 }
 
 /* Fonction de lecture d'une commande horloge
@@ -313,9 +271,7 @@
 */
 void Read_Clock()
 {
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire le nombre de répétition
-    Sleep = Character[0]-'0'; // Stocker le temps d'affichage
+    Sleep = Search_Read_Char('=',Sleep);
     
     pc.printf("Affichage de l'heure pendant %d secondes\n\n",Sleep); // affichage dans la console
     
@@ -330,16 +286,13 @@
 */
 void Read_Temperature()
 {
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire le nombre de répétition
-    Sleep = Character[0]-'0'; // Stocker le temps d'affichage
+    Sleep = Search_Read_Char('=',Sleep);
     
     pc.printf("Affichage de la temperature pendant %d secondes\n\n",Sleep); // affichage dans la console
     
     Temperature();
 }
 
-
 /* Fonction de lecture d'une commande lecture de la pile de backup
 *
 *  Exemple d'utilisation:
@@ -348,9 +301,7 @@
 */
 void Read_Backup()
 {
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire le nombre de répétition
-    Sleep = Character[0]-'0'; // Stocker le temps d'affichage
+    Sleep = Search_Read_Char('=',Sleep);
     
     pc.printf("Affichage de la tension de la batterie pendant %d secondes\n\n",Sleep); // affichage dans la console
     
@@ -372,17 +323,13 @@
     Index->read(Line_Buffer, 3); // lire 16 caractères
     unsigned int height = atoi(Line_Buffer); // Convertion de la valeur de Ascii vers un entier
 
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire la vitesse de lecture
-    Speed = Character[0]-'0';  // stocker la vitesse de lecture
+    Speed = Search_Read_Char('=',Speed);
     
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire le sens de lecture
-    Up = Character[0]-'0';  // stocker le sens de lecture
+    Up = Search_Read_Char('=',Up);
     
     Try_Open_File(); // Ouvrir le fichier
     
-    read40KB(); // Charger le scrolling dans la mémoire
+    readKB(Scrolling_Buffer,40); // Charger le scrolling dans la mémoire
     
     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);
     
@@ -399,7 +346,6 @@
     }
     else
     {
-
         for(unsigned char decal = (height-32); decal!=0; decal--) {
             // Remplir la mémoire vidéo avec une image
             for(unsigned int count = 0; count<4096; count++)
@@ -427,17 +373,13 @@
     Index->read(Line_Buffer, 4); // lire 16 caractères
     unsigned int width = atoi(Line_Buffer); // Convertion de la valeur de Ascii vers un entier
 
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire la vitesse de lecture
-    Speed = Character[0]-'0';  // stocker la vitesse de lecture
+    Speed = Search_Read_Char('=',Speed);
 
-    Search_Char('=');  // lire jusqu'au prochain =
-    Index->read(Character, 1); // Lire le sens de lecture
-    Left = Character[0]-'0';  // stocker le sens de lecture
-    
+    Left = Search_Read_Char('=',Left);
+
     Try_Open_File(); // Ouvrir le fichier
     
-    read40KB(); // Charger le scrolling dans la mémoire
+    readKB(Scrolling_Buffer,40); // Charger le scrolling dans la mémoire
     
     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);
     
@@ -470,32 +412,52 @@
     Flush_ascii_buffer(Line_Buffer);
 }
 
+/* Fonction de réglage du brightness (de 0 à 9)
+*   Exemple: Brightness=5
+*/
+void Set_Brightness()
+{
+    Brightness_level = Search_Read_Char('=',Brightness_level); // Lire le brightness souhaité
+    
+    pc.printf("Reglages du niveau de brightness sur %d\n\n",Brightness_level); // affichage dans la console 
+    
+    Time_Shade0 = Start_Time_Shade0 / Correction_Brightness[Brightness_level] ;
+    Time_Shade1 = Start_Time_Shade1 / Correction_Brightness[Brightness_level] ;
+    Time_Shade2 = Start_Time_Shade2 / Correction_Brightness[Brightness_level] ;
+    Time_Shade3 = Start_Time_Shade3 / Correction_Brightness[Brightness_level] ;
+    Time_Shade4 = Start_Time_Shade4 / Correction_Brightness[Brightness_level] ;
+    Time_Shade5 = Start_Time_Shade5 / Correction_Brightness[Brightness_level] ;
+    Time_Shade6 = Start_Time_Shade6 / Correction_Brightness[Brightness_level] ;
+}
+
 /* Lire et effectuer la prochaine commade du fichier index.txt */
 void Read_Next_Command()
 {
     Search_Char('>'); // Chercher le prochain début de commande
     Index->read(Command, 5); // lire la commande
 
-    if( strcmp("Anima", Command) == 0)      // A => Animation
+    if( strcmp("Anima", Command) == 0)      // Animation
         Read_Animation();
-    else if(strcmp("Write", Command) == 0) // W => Write
+    else if(strcmp("Write", Command) == 0) // Write
         Read_Text();
     else if(strcmp("Clock", Command) == 0)
-        Read_Clock();       // C => Clock
+        Read_Clock();       // Clock
     else if(strcmp("Tempe", Command) == 0)
-        Read_Temperature(); // T => Temperature
+        Read_Temperature(); // Temperature
     else if(strcmp("Backu", Command) == 0)
-        Read_Backup();      // B => pile de Backup
+        Read_Backup();      // pile de Backup
     else if(strcmp("Setco", Command) == 0)
-        Set_Color();        // S => changement des couleurs du mode monochrome
+        Set_Color();        // changement des couleurs du mode monochrome
     else if(strcmp("Verti", Command) == 0)
-        Vertical_Scrolling_SD(); // V => Scrolling vertical depuis la SD
+        Vertical_Scrolling_SD(); // Scrolling vertical depuis la SD
     else if(strcmp("Horiz", Command) == 0)
-        Horizontal_Scrolling_SD(); // H => Scrolling Horizontal depuis la SD
+        Horizontal_Scrolling_SD(); // Scrolling Horizontal depuis la SD
     else if(strcmp("Image", Command) == 0)
-        Image_SD(); // I => Image depuis la SD
+        Image_SD(); // Image depuis la SD
     else if(strcmp("Score", Command) == 0)
-        Score_SD(); // I => Superposer une Image avec du texte depuis la SD (scores)
+        Score_SD(); // Superposer une Image avec du texte depuis la SD (scores)
+    else if(strcmp("Brigh", Command) == 0)
+        Set_Brightness(); // Régler le niveau de brightness
     else
         pc.printf("Aucune Commande dans le fichier index.ini\n");
 }