Bonjour,
Comme d'habitude j'ai l'habitude de dire c'est le compilateur quand je fais une faute. Et là je bute sur celle là depuis deux semaines (je ne fais pas que ça, mais souvent la nuit porte conseil)
Je joue avec un afficheur graphique sensitif parallèle VMA412 sur une Uno. Je suis en train d'écrire un programme ressemblant au Paint de windowsXP. Le premier avril j'avais fait une video avec ce logiciel, précédé d'un poisson. La première minute montre en effet le chargement de windows qui est complètement bidon, mais la suite est réelle. Je n'ai pas montré la possibilité d'écrire des mots, cela ne fonctionnait pas.
L'écran est le suivant:

Le principe est le suivant: pour choisir une fonction, j'ai 11 boutons radio (quand un s'active, il désactive les autres) et je peux choisir une fonction parmi 11 (crayon, pipette, gomme...). 3 fonctions n'entrent pas en jeu et sont géré par d'autres fonctions : effacement d'écran, sauvegarde et lecture.
Quand je commence à dessiner la fonction onSelectDessin() est appelée, elle travaille tant que le stylet est appuyé, par exemple dessine avec le crayon, indique ou va se faire le cercle ou le rectangle... Quand je soulève le stylet elle fait éventuellement un deuxième travail, trace le cercle ou le rectangle...
La fonction onSelectDessin() se compose principalement d'un switch, qui va différencier ce qu'il y a à faire en fonction de la fonction C'est getRadioValeur() qui retourne un code de 0 à 10. Et j'ai un problème avec la fonction 10 (écrit un texte).
Comme le switch n'exécute pas ce qui est derrière case 10: j'ai doublé le travail à faire avec in if, genre:
switch (getRadioValeur())
{
case 0: ...
case 1: ...
....
case 10: <le code pour écrire des lettres>
}
if (getRadioValeur()==10) <le code pour écrire des lettres>
Voici le code de la fonction onSelectDessin(). J'ai retiré les fonction 0 à 8, la taille du message est trop grosse sinon. Fonction complète attachée. Le code complet ne peut s'éxécuter qu'avec un VMA412 équipé d'un ST7781.
/////////////////////////////////////////////////////////////////////////////
//// Dessin //
/////////////////////////////////////////////////////////////////////////////
int x2, y2, // Valeur actuelles
x1, y1; // Valeur une boucle plus tôt
String s; // Pour les tracés de textes
void onSelectDessin() // Appelée quand je commence le dessin
{
int x = getTouchX(); int y = getTouchY(); // Récupère les coordonnés visées
x2 = x; y2 = y; // Au départ tous les points sont confondus; x1 et y1 sont initialisés plus loin
setLimites(68, 2, 317, 196); // A la zone de dessin
// Initialisations pour certains tracés
switch (getRadioValeur())
{
case 0: // ////////// Crayon //////////
line(x, y, x, y, couleur_trace); // Initialise pour lineTo
break;
case 4: // ////////// Droite //////////
case 5: // ////////// Cercle //////////
case 6: // ////////// Rectangle //////////
case 7: // ////////// Inversion //////////
setDrawInverse(INVERSE); // On va faire un curseur droite
break;
}
do // On boucle sans passer par le gestionnaire, trop lent
{
x1 = x2, y1 = y2; //Sauvegarde de la valeur du coup d'avant
x2 = getTouchX(); y2 = getTouchY(); // Utile pour la boucle
//###############################################################################
// le problème commence ici. Si je veux écrire du texte le bouton Radio 10 est sélectionné
// et getRadioValeur retourne 10
//###############################################################################
Serial.print("Je vais rentrer dans le switch et getRadioValeur() vaut "); Serial.println(getRadioValeur());
switch (getRadioValeur())
{
case 0:
......
case 8: // ////////// Fill //////////
fill(x2, y2, couleur_trace);
break;
case 9: // ////////// Bombe //////////
float angle = random(10000); angle = angle * PI / 5000;
byte rayon = random(15);
point(x2 + rayon * cos(angle), y2 + rayon * sin(angle), couleur_trace);
break;
//#######################################################################
// Normalement je devrais rentrer dans la partie case 10
//########################################################################
case 10: // ////////// Lettres //////////
Serial.println("Je suis entré dans case 10");
s = clavier40(79, 10, F("Chaine?"));
setTextSize(clavier40(79, 10, F("Taille?")).toInt());
setTextColor(couleur_trace);
setTextCursor(x2, y2);
text(s);
Serial.println("J'ai fini case 10");
break;
//#########################################################################
// Fin de la partie case 10
//#########################################################################
}
//#######################################################################
// Alternative je passe par if (pour vérifier que ce que j'ai écris fonctionne
//########################################################################
if (getRadioValeur() == 10)
{
Serial.println("Je suis entré par le if");
s = clavier40(79, 10, F("Chaine?"));
setTextSize(clavier40(79, 10, F("Taille?")).toInt());
setTextColor(couleur_trace);
setTextCursor(x2, y2);
text(s);
Serial.println("J'ai fini le if");
}
//#######################################################################
// Fin du if
//########################################################################
} while (isTouchTrue()); // Fini si on lâche le stylet
switch (getRadioValeur()) // Onvient de lâcher le stylet
{
case 4: // ////////// Droite //////////
case 5: // ////////// Cercle //////////
case 6: // ////////// Rectangle //////////
case 7: // ////////// Inversion //////////
}
setLimites(0, 0, 319, 239);
}
A part la fonction 10 "écriture de mots", tout fonctionne à merveille. Comme la fonction 10 est doublée, avec le code ci-dessus, quand le stylet pointe, je pensais avoir les messages
Je vais rentrer dans le switch et getRadioValeur() vaut 10
Je suis entré dans case 10
J'ai fini case 10
Je suis entré par le if
J'ai fini le if
et je devrai avoir deux fois la possibilité décrire des lettres. Mais j'ai:
Je vais rentrer dans le switch et getRadioValeur() vaut 10
Je suis entré par le if
J'ai fini le if
Et évidemment je ne peux entrer qu'une fois du texte
La partie concernant la case 10 n'est pas exécutée, je devrai dire n'est pas compilée
- Si je supprime tout ce qui concerne case 10, le programme fait la même taille (même si je rajoute un asm("nop")!)
- Si je change les noms des fonction 9 et 10 , la taille du programme ne change pas, la clause case 10 n'est pas compilée
- Si j'inverse en mettant d'abord case 10 puis case 9, mon programme augmente de taille et la clause case 10 fonctionne (j'avais déja fait ce test mais cela n'avait pas marché il y a 10 jours)
- A un moment j'avais viré le switch pour le remplacer par des if, c'était pareil, pas de "if 10"
Ya pas deux solutions, j'ai écrit un bug, mais je ne le vois pas. Ou l'ai-je mis?

onSelectDessin.ino (5.59 KB)