Dessin avec couleur du capteur rgb et taille de pinceau dépendant de la proximité

Dependencies:   BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG mbed

Revision:
1:8ce21f87a36e
Parent:
0:ef7767cb4b09
--- a/main.cpp	Thu Jun 21 09:42:03 2018 +0000
+++ b/main.cpp	Thu Jun 21 10:22:06 2018 +0000
@@ -1,7 +1,7 @@
 #include "mbed.h"
 #include "LCD_DISCO_F746NG.h"
 #include "TS_DISCO_F746NG.h"
-
+#include "math.h"
 
 I2C i2c(I2C_SDA,I2C_SCL);
 LCD_DISCO_F746NG lcd;
@@ -19,7 +19,7 @@
     uint8_t idx;
     uint8_t cleared = 0;
     uint8_t prev_nb_touches = 0;
-    
+
     uint32_t couleur;
 
     char control[3];
@@ -33,10 +33,10 @@
 
     char dataB1[1];
     char dataB2[1];
-    
+
     int rayon;
-    
-    uint8_t r,g,b,f;
+
+    int r,g,b,f;
 
     address=0x72; //adresse du capteur sur 7 bits (0x39 sur 8 bits)
 
@@ -45,8 +45,8 @@
     status = ts.Init(lcd.GetXSize()+10, lcd.GetYSize()+10);
     lcd.Clear(0xFFFFFFF0);
     lcd.SetFont(&Font12);
-    lcd.SetBackColor(0xFFFFFFFE); 
-    lcd.SetTextColor(LCD_COLOR_WHITE);
+    lcd.SetBackColor(0xFFFFFFFE);
+    lcd.SetTextColor(LCD_COLOR_BLACK);
 
     control[0]=0x80;  //registre activation power / proximité / RGB
     control[1]=0x07;  //commande d'activation proximité et RGB
@@ -56,46 +56,56 @@
     control[1]=0x07;  //commande du gain
     i2c.write(address, control, 2);
 
-    control[0]=0x90;
-    control[1]=0x30;
-    i2c.write(address, control, 2);
+    while(1) {
+
+        control[0]=0x9C;  //registre donnée proximité
+        i2c.write(address, control, 1,true);
+        i2c.read(address,dataProx,1);
+
+        control[0]= 0x96; //registre donnée rouge partie 1
+        i2c.write(address, control, 1,true);
+        i2c.read(address,dataR1,1);
 
-    while(1) {
-        
-    control[0]=0x9C;  //registre donnée proximité
-    i2c.write(address, control, 1,true);
-    i2c.read(address,dataProx,1);
+        control[0]= 0x97; //registre donnée rouge partie 2
+        i2c.write(address, control, 1,true);
+        i2c.read(address,dataR2,1);
 
-    control[0]= 0x96; //registre donnée rouge partie 1
-    i2c.write(address, control, 1,true);
-    i2c.read(address,dataR1,1);
+        control[0]= 0x98; //registre donnée vert partie 1
+        i2c.write(address, control, 1,true);
+        i2c.read(address,dataG1,1);
+
+        control[0]= 0x99; //registre donnée vert partie 2
+        i2c.write(address, control, 1,true);
+        i2c.read(address,dataG2,1);
 
-    control[0]= 0x97; //registre donnée rouge partie 2
-    i2c.write(address, control, 1,true);
-    i2c.read(address,dataR2,1);
+        control[0]= 0x9A; //registre donnée bleu partie 1
+        i2c.write(address, control, 1,true);
+        i2c.read(address,dataB1,1);
 
-    control[0]= 0x98; //registre donnée vert partie 1
-    i2c.write(address, control, 1,true);
-    i2c.read(address,dataG1,1);
+        control[0]= 0x9B; //registre donnée bleu partie 2
+        i2c.write(address, control, 1,true);
+        i2c.read(address,dataB2,1);
 
-    control[0]= 0x99; //registre donnée vert partie 2
-    i2c.write(address, control, 1,true);
-    i2c.read(address,dataG2,1);
+        r=/*dataR2[0] << 4 |*/ dataR1[0]*1.6;  //composition de la valeur rouge
+        g=/*dataG2[0] << 4 |*/ dataG1[0]*1.6;  //composition de la valeur vert
+        b=/*dataB2[0] << 4 |*/ dataB1[0]*1.6;  //composition de la valeur bleu
+        if (r>255) r=255;
+        if (g>255) g=255;
+        if (b>255) b=255;
+        f=0xFF;
 
-    control[0]= 0x9A; //registre donnée bleu partie 1
-    i2c.write(address, control, 1,true);
-    i2c.read(address,dataB1,1);
+        couleur = f << 24 | r << 16 | g << 8 | b; //combinaison des valeurs des couleur au format uint32_t rgb
 
-    control[0]= 0x9B; //registre donnée bleu partie 2
-    i2c.write(address, control, 1,true);
-    i2c.read(address,dataB2,1);
+        lcd.SetTextColor(couleur);
+        sprintf((char*)text, "couleur %0X  P : %0X",couleur,dataProx[0]); // stockage du texte contenant toute les données
+        lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE); //écriture de la valeur rgb de la couleur détectée
 
         ts.GetState(&TS_State);
         if (TS_State.touchDetected) {
             // Clear lines corresponding to old touches coordinates
             if (TS_State.touchDetected < prev_nb_touches) {
-                for (idx = (TS_State.touchDetected + 1); idx <= 5; idx++) {
-                    lcd.ClearStringLine(idx); 
+                for (idx = (TS_State.touchDetected + 1); idx <= 2; idx++) {
+                    lcd.ClearStringLine(idx);
                 }
             }
             prev_nb_touches = TS_State.touchDetected;
@@ -105,24 +115,15 @@
                 x = TS_State.touchX[idx]; //récupération de la position x de l'appui
                 y = TS_State.touchY[idx]; //récupération de la position y de l'appui
             }
-            
-            r=dataR2[0] << 4 | dataR1[0];  //composition de la valeur rouge 
-            g=dataG2[0] << 4 | dataG1[0];  //composition de la valeur vert 
-            b=dataB2[0] << 4 | dataB1[0];  //composition de la valeur bleu 
-            f=0xFF;
-            
-            couleur = f << 24 | r << 16 | g << 8 | b; //combinaison des valeurs des couleur au format uint32_t rgb
-            
-            sprintf((char*)text, "couleur %0X  P : %0X",couleur,dataProx[0]); // stockage du texte contenant toute les données
-            lcd.DisplayStringAt(0, LINE(0), (uint8_t *)&text, LEFT_MODE); //écriture de la valeur rgb de la couleur détectée
-            
-            lcd.SetTextColor(couleur);
-            rayon = 15;
-            lcd.FillCircle(TS_State.touchX[0], TS_State.touchY[0], rayon);
-            
+
+
+            rayon = ceil((float)dataProx[0]/255.0 * 15.0 +1.0);
+            if((TS_State.touchY[0]-rayon>1)&&(TS_State.touchX[0]-rayon>1)) {
+                lcd.FillCircle(TS_State.touchX[0], TS_State.touchY[0], rayon);
+            }
         } else {
             if (!cleared) {
-               //lcd.Clear(0xFFFFFFF0);
+                //lcd.Clear(0xFFFFFFF0);
                 cleared = 1;
             }
         }