[CONSEILS] Texte réactif (cliquable) sur écran TFT 4"3 pouces + Arduino Uno

Réponse en plusieurs bouts:


Bon je viens de passer 1h30 à jouer avec mon nouvel écran :slight_smile:

J'ai passé une heure environ à lire en diagonale deux documents clés: Le FT800 Series Programmer Guide ainsi que la Datasheet du FT801.

Si on ne comprend pas ce Chip on ne comprend pas trop comment ça marche et la richesse du processeur. C'est donc une lecture importante.

Une fois ceci fait, un coup d'oeil rapide dans quelques exemples et tout devient clair.

Ce qu'il faut savoir:

1/ LA PARTIE GRAPHIQUE

  • Une Display List est un ensemble de commandes de haut niveau que le processeur est capable d'interpréter pour peindre l'écran

  • Pour créer une display list, on envoie la commande CMD_DLSTART. ça établit un contexte de commandes et toutes les commandes qui suivent se trouve dans cette display list

  • Une fois qu'on a démarré la nouvelle Display List, on va généralement demander au processeur de partir d'un contexte écran vierge. la commande CLEAR prend en paramètre 3 paramètres (0 ou 1) C (couleur), S (stencil) et T (tag). Si On met la valeur 1 on efface ce que le processeur connait, si on met la valeur 0 on conserve.

  • En conséquence on commencera souvent tout dessin de nouvel écran par un CMD_DLSTART suivie de CLEAR(1,1,1) pour partir propre. C'est tellement fréquent que la bibliothèque fournie propose la méthode DLStart() qui fait cela.

  • Pour terminer une Display List, on envoie la commande DISPLAY. Attention ça n'affiche rien à l'écran pour le moment.

  • Le processeur maintient deux Display Lists. La première est dite active et sert à rafraichir l'écran (ce que vous voyez en ce moment). La seconde est celle de l'état futur de l'écran. Au démarrage la display list active est vide, donc on n'a rien sur l'écran.

  • Pour échanger la liste active et la liste de l'état futur (et donc la rendre active), on envoie la commande CMD_SWAP (échanger les 2 listes). Au moment où on fait cela le contenu de cette liste devient le contenu actif et ça repeint l'écran avec toutes les commandes contenue dans cette Display List.

  • En conséquence on terminera souvent tout dessin de nouvel écran par un DISPLAY suivi d'un CMD_SWAP. C'est tellement fréquent que la bibliothèque fournie propose la méthode DLEnd() qui fait cela.

  • Les coordonnées (x,y) valides varient entre -1023 et +1023. le (0,0) est en haut à gauche de l'écran et les x positifs vont vers la droite et y positifs vers le bas. Ces coordonnées sont dans le monde utilisateur. Au niveau de la machine il y a un mode de représentation dit "pixel précision" ou on multiplie tout par 16. Les coordonnées donc au niveau du moteur graphique vont de -16384 à 16383

  • Pour peindre l'écran il y a une quelques commandes puissantes que vous trouverez dans le FT800 Series Programmer Guide au chapitre 2.5.3 Drawing pattern page 23. En gros on envoie la commande BEGIN, ensuite un certain nombre primitives graphiques ou sommets (vertices) à relier d'une certaine façon et la commande END. Les coordonnées sont exprimées en mode "pixel précision" (donc on fait x16)

Par exemple pour tracer une ligne brisée à 2 segments, rouge, de 2 pixels d'épaisseur sur fond bleu, on peut envoyer:

CLEAR_COLOR_RGB(0,0,255) // Bleu 
COLOR_RGB(255, 0, 0) // Rouge
CLEAR(1 ,1 ,1) // Efface l'ancien contexte
LINE_WIDTH(2 * 16) // 2 pixels d'épaisseur
BEGIN(LINE_STRIP) // début d'une primitive de type LINE_STRIP qui attend une succession de points à joindre
VERTEX2F(5 * 16,5 * 16) ) // on part de (5,5)
VERTEX2F(50 * 16,30 * 16) // on va en (50,30)
VERTEX2F(63 * 16,50 * 16) // puis en (63,50)
END()

Toutes ces primitives sont gérées par le processeur graphique et calculée directement en dehors de l'arduino ce qui fait que l'on peut avoir un écran sur lequel les dessins se font rapidement

  • De plus, et c'est très puissant, le processeur contient des procédures de dessins d'objets avancés appelés des WIDGETS (page 146 de la doc). Il sait afficher par exemple afficher un texte (CMD_TEXT), un truc qui ressemble à un bouton (CMD_BUTTON), un cadran (jauge) (CMD_GAUGE), une rangée de touche (CMD_KEYS ), une barre de pprogression (CMD_PROGRESS) et pleins d'autres trucs CMD_SCROLLBAR, CMD_SLIDER, CMD_DIAL, CMD_TOGGLE, CMD_NUMBER et deux animations CMD_CALIBRATE (qui lance une animation de calibration du touch engine de l'écran) et CMD_SPINNER qui fait tourner une petite roue d'attente sur l'écran. Toutes ces fonctions on différents paramètres que vous découvrirez dans la doc et sont susceptibles d'être colorés en fonction de vos choix pour les commandes CMD_FGCOLOR, CMD_BGCOLOR et COLOR_RGB. Je vous laisse les explorer, il y a plein d'exemples.

  • Enfin Il y a un autre concept super important qui a trait aux Display List: la notion de TAG.
    Quand le FT801 fabrique la représentation graphique de vos ordres, il maintient une sorte de zone couverte par votre dessin. Un Tag est une étiquette que l'on met sur une région d'une display list. Pour affecter un Tag à une zone, il faut commencer par autoriser la mise à jour du buffer des TAGs. ça se fait en appelant la commande TAG_MASK avec le paramètre 1 (voir doc page 137).
    Pour donner un numéro à une certaine portion de votre display List, vous appelez la commande TAG (cf page 136) avec un paramètre sur 8 bits qui est le numéro de cette zone. Pour passer à la zone suivante il suffit d'appeler TAG avec un nouveau numéro et pour terminer l'enregistrement du TAGs et ne pas associer de TAG à ce qui suit dans la display list, il faut d'appeler TAG_MASK avec le paramètre 0. Si Aucun TAG n'est déclaré et que le TAG MASK est actif, alors tout l'écran porte le numéro de zone 255. Il ne faut pas utiliser le N° de TAG 0 non plus donc on peut nommer des zones de 1 à 254.

Voilà si vous avez compris cela, vous êtes capable de dessiner des choses sur l'écran et de leur affecter un TAG si vous le souhaitez.