Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » Forum Ti68K » Programmation C » ngetchx() avec _rowread (26 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
Thor Ecrit le: Jeudi 3 juin 2004 à 11:53 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Je veux programmer une fonction qui fonctionne comme ngetchx() mais je ne l'a trouve pas trés fluide. Pourriez vous m'aider ?
Voilà la fonction :
int key()
{
short value=0;
while (value==0)
{
  // ESC is pressed
 if   (_rowread(0x2FF)&0x40) value=264;
 // Clear is pressed
 if(_rowread(~((short)(1<<7))) & (1<<5)) off();
 // Left is pressed
 if (_rowread(0x3FE)&0x10) value=337;
 // Down is pressed
 if (_rowread(0x3FE)&0x80 & (1<<7)) value=344;
 // Up is pressed
 if (_rowread(0x3FE)&0x20 & (1<<5)) value=338;
}
my_wait(30);
return value;
}

Attention : my_wait est définie comme ceci :
INT_HANDLER gray_int_1 = NULL; //used to save gray handler installed automatically if you used GrayOn()

DEFINE_INT_HANDLER (my_int_1_handler) // my own interrupt 1 handler which increments the counter
{  
  counter++;
  ExecuteHandler(gray_int_1);
}

//Function to wait between two different display
void my_wait (unsigned short delay)
{
  gray_int_1 = GetIntVec(AUTO_INT_1);
  counter = 0;
  SetIntVec(AUTO_INT_1, my_int_1_handler);
  while (counter<delay);
  SetIntVec(AUTO_INT_1, gray_int_1); 
}
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°1   Marquer comme non lu.
Sasume Ecrit le: Jeudi 3 juin 2004 à 13:02 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

1. A quoi sert my_wait ?
2. Il faut désactiver les AI1 et 5 pour utiliser _rowread sans problèmes.
3. Tu as beaucoup d'appels à _rowread(0x3FE). Un seul suffit, et sauve le résultat dans une variable.
    
./Post n°2   Marquer comme non lu.
Thor Ecrit le: Jeudi 3 juin 2004 à 13:41 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Sasume :
1. A quoi sert my_wait ?

Ca sert à patienter entre deux appui : c'est un key_delay !
Sasume :
2. Il faut désactiver les AI1 et 5 pour utiliser _rowread sans problèmes..

Ca je le fais mais je ne le montre pas ici.
Sasume :
3. Tu as beaucoup d'appels à _rowread(0x3FE). Un seul suffit, et sauve le résultat dans une variable

Euh là je n'est pas compris :(
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°3   Marquer comme non lu.
Sasume Ecrit le: Jeudi 3 juin 2004 à 13:48 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

1. Mais la c'est dommage, ça fait aussi une temporisation même lorsqu'on ne laisse pas une touche enfoncée. Il ne faut mettre cette temporisation QUE si une même touche est enfoncée.

3. val=_rowread(0x3FE);
if(val & machin) faire_machin();
if(val & truc) faire_truc();
    
./Post n°4   Marquer comme non lu.
Thor Ecrit le: Jeudi 3 juin 2004 à 13:54 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Sasume :
1. Mais la c'est dommage, ça fait aussi une temporisation même lorsqu'on ne laisse pas une touche enfoncée. Il ne faut mettre cette temporisation QUE si une même touche est enfoncée.

3. val=_rowread(0x3FE);
if(val & machin) faire_machin();
if(val & truc) faire_truc();

1. Je veux un ngetchx() c'est à dire qu'il faut de toute façon que ça reste dans cette fonction tant que je n'appuie pas sur une touche
2. Oui je vois le style !
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°5   Marquer comme non lu.
Sasume Ecrit le: Jeudi 3 juin 2004 à 13:56 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

1. Tu te trompes.
Vire le my_delay et tu verras que ta fonction attend bien l'appui d'une touche.
    
./Post n°6   Marquer comme non lu.
Thor Ecrit le: Jeudi 3 juin 2004 à 14:01 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Ben oui mais si je lache pas la touche ça va trop, bien trop vite :(
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°7   Marquer comme non lu.
Sasume Ecrit le: Jeudi 3 juin 2004 à 14:28 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

J'ai bien compris. C'est pour ça que je te dis que tu ne dois temporiser que si c'est la même touche qui est enfoncée.
    
./Post n°8   Marquer comme non lu.
Thor Ecrit le: Jeudi 3 juin 2004 à 14:38 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Il faut donc que ma variable value soit déclarée en global afin de pouvir rester en mémoire en 2 différents appel : il n'y a pas d'autres solutions #confus#
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°9   Marquer comme non lu.
Sasume Ecrit le: Jeudi 3 juin 2004 à 14:45 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

En static, sinon. C'est plus simple.
    
./Post n°10   Marquer comme non lu.
Thor Ecrit le: Jeudi 3 juin 2004 à 14:52 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Ok merci :)
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°11   Marquer comme non lu.
Thor Ecrit le: Vendredi 18 juin 2004 à 16:34 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Et de cete façon c'est mieux?
int key()
{
short value=0;
static short past;
while (value==0)
{
  // ESC is pressed
 if   (_rowread(0x2FF)&0x40) value=264;
 // Clear is pressed
 if(_rowread(~((short)(1<<7))) & (1<<5)) off();
 // Left is pressed
 if (_rowread(0x3FE)&0x10) value=337;
 // Down is pressed
 if (_rowread(0x3FE)&0x80 & (1<<7)) value=344;
 // Up is pressed
 if (_rowread(0x3FE)&0x20 & (1<<5)) value=338;
}
if (value==past) my_wait(30);
value=past;
return value;
}

Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°12   Marquer comme non lu.
Sasume Ecrit le: Samedi 19 juin 2004 à 00:07 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Ça compile sans warning, ça ?

Sinon, le principe m'a l'air bien, sauf qu'il faut mettre past=value à la fin de la fonction, pas l'inverse.
En fait, ton truc n'est pas tout à fait au point, parce que si qq1 appuie-relâche-appuie très vite sur une touche, le programme aura un temps de retard.
    
./Post n°13   Marquer comme non lu.
Thor Ecrit le: Samedi 19 juin 2004 à 00:32 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Je ne l'ai pas compilé encore car là je peux pas :( Pour le past=value je me suis trompé tu as raison.
>>si qq1 appuie-relâche-appuie très vite sur une touche, le programme aura un temps de retard. Tu veux dire que le programme ne tiendra pas compte du deuxième appui c'est ça?
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°14   Marquer comme non lu.
Sasume Ecrit le: Samedi 19 juin 2004 à 09:14 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Si mais en trop tard, et si l'utilisateur appuie-relâche une touche très vite, plusieurs fois, là par contre, ça ne sera pas pris en compte.
    
./Post n°15   Marquer comme non lu.
Thor Ecrit le: Samedi 19 juin 2004 à 09:49 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Sasume :
Ça compile sans warning, ça ?

Sinon, le principe m'a l'air bien, sauf qu'il faut mettre past=value à la fin de la fonction, pas l'inverse.
En fait, ton truc n'est pas tout à fait au point, parce que si qq1 appuie-relâche-appuie très vite sur une touche, le programme aura un temps de retard.
Tu veux donc dire que si l'utilisateur appuie sur "ESC" puis rapidement sur "Up" le deuxième est pris en compte et pas le premier? Je ne comprend pas le problème ici #confus#
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°16   Marquer comme non lu.
Sasume Ecrit le: Samedi 19 juin 2004 à 10:00 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Non, si deux touches différentes sont appuyées, la temporisation ne se fait pas, donc il n'y aura aucun problème.
Mais je parlais du cas où on appuie plusieurs fois de suite sur la même touche, là ça pose problème.
Ce que tu peux faire, c'est rajouter dans ta boucle : if(_rowread(0))past=0;
Ça éliminera on problème.
Sinon, tu peux rendre la fonction plus rapide en faisant un seul appel à _rowread pour les touches qui sont sur la même ligne de la matrice clavier.
    
./Post n°17   Marquer comme non lu.
Thor Ecrit le: Samedi 19 juin 2004 à 10:19 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Moi je ne vois aucun problème lorsque j'appuie rapidement sur la m^me touche #confus# (je dis ça en regardant le code car j'ai pas testé)
Cyril MOTTIER aka {==Thor==}
Modérateur général du forum de Tigen
[Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
Mon site perso c'est ici
    
./Post n°18   Marquer comme non lu.
Sasume Ecrit le: Samedi 19 juin 2004 à 10:39 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Bah peut-être que je me trompe alors.
Essayons de tracer le code :
Premier appel de la fonction (on dit que past=0) : tu appuies sur haut, donc on sort du while, puis on compare avec past, les valeurs sont différentes, donc past prend la valeur de value et on retourne value.
Deuxième appel : (past = 338) : tu n'appuies sur rien, donc on reste dans la boucle, puis tu appuies sur haut à nouveau, donc on sort de la boucle, puis on compare past et value, leurs valeurs sont les mêmes, donc on fait une temporisation, puis past prend la valeur de value et on retourne value.

Donc la temporisation est appelée même si tu as relaché la touche entretemps, ce qui fait que si tu appuies-relâches une touche très rapidement, la tempo ralentira le tout et sautera carrément quelques appuis.
-Edité le Samedi 19 juin 2004 à 10:40 par Sasume-
    
./Post n°19   Marquer comme non lu.
Thor Ecrit le: Samedi 19 juin 2004 à 10:51 Déconnecté(e)    Voir le profil de Thor Envoyer un email à Thor Visiter le site WEB de Thor Envoyer un message privé à Thor  


Sasume :
Bah peut-être que je me trompe alors.
Essayons de tracer le code :
Premier appel de la fonction (on dit que past=0) : tu appuies sur haut, donc on sort du while, puis on compare avec past, les valeurs sont différentes, donc past prend la valeur de value et on retourne value.
Deuxième appel : (past = 338 ) : tu n'appuies sur rien, donc on reste dans la boucle, puis tu appuies sur haut à nouveau, donc on sort de la boucle, puis on compare past et value, leurs valeurs sont les mêmes, donc on fait une temporisation, puis past prend la valeur de value et on retourne value.

Donc la temporisation est appelée même si tu as relaché la touche entretemps, ce qui fait que si tu appuies-relâches une touche très rapidement, la tempo ralentira le tout et sautera carrément quelques appuis.
-Edité le Samedi 19 juin 2004 à 10:40 par Sasume-

Je dois vraiment pas être réveillé car je comprend jusqu'à puis past prend la valeur de value et on retourne value. mais aprés je ne vois pas mais absolument pas le problème. Répètons la fonction ngetchx() :
  • Elle retourne une valeur propre à chaque touche : c'est OK
  • Elle attend entre 2 appuis sur une même touche pendant un temps delay : c'est OK
  • Elle tourne en boucle tant qu'il n'y a pas d'appui : c'est OK
    Moi je crois que ma fonction fait tout ça #confus#
    Cyril MOTTIER aka {==Thor==}
    Modérateur général du forum de Tigen
    [Etudiant à l'Institut National des Sciences Appliquées (INSA) de Rennes]
    Mon site perso c'est ici
        
      :: Index » Forum Ti68K » Programmation C » ngetchx() avec _rowread (26 réponse(s))
    Pages : 1/2     « [1] 2 » »|

    .Répondre à ce sujet
    Les boutons de code
    [B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
    Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
    Couleurs :
    Saisissez votre message
    Activer les smileys
         

    Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
    Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
    Page générée en 56.58ms avec 18 requetes