1

Salut,

J'ai un problème avec les interruptions, je les ai détournées vers DUMMY_HANDLER mais plus moyen de tester les touches. Le but étant de désactiver la barre d'état (diamond alpha 2nd ...etc...).

Mon code ressemble à ça :

Save_Int_1=GetIntVec(AUTO_INT_1);
Save_Int_5=GetIntVec(AUTO_INT_5);
SetIntVec(AUTO_INT_1, DUMMY_HANDLER);
SetIntVec(AUTO_INT_5, DUMMY_HANDLER);
...

if(!OSdequeue(&Key, KbQ))
{
switch(Key)
{
...
}
}

...

SetIntVec(AUTO_INT_1, Save_Int_1);
SetIntVec(AUTO_INT_5, Save_Int_5);

Est-ce que quelqu'un peut éclairer ma lanterne, siouplait ?

2

si tu détournes ces interruptions (en particulier la 1), tu ne peux plus lire le clavier via des fonctions haut-niveau, mais seulement par des appels bas-niveau, de la famille de _rowread (_keytest, par exemple).
en effet, les fonctions "haut-niveau" (genre ngetchx, kbhit et compagnie) sont basées sur l'auto_int_1... et ne fonctionnent donc pas si celui-ci est détourné
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

3

Merci squale92,
je croyais que OSdequeue était bas niveau, je vais aller voir ces autres fonctions.

4

Bon, j'ai un problème avec _keytest. Comment gérer la répétition de touche qui est beaucoup trop rapide? Sans boucle pour vider la queue : ça bloque le programme tant qu'on appuie sur la touche. Si quelqu'un a une idée, merci d'avance.

5

utilise une interruption pour la vider à intervalles réguliers ?
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

6

J'ai essayé de vider la queue dans une interruption, mais si on laisse la touche enfoncée ça bloque l'exécution du programme jusqu'à ce qu'on relache.

7

int repeat = 0;

boucle {

if(_keytest(..))
  repeat++;
if(repeat == 1) {
  ... faire des actions correspondant a l'appui sur la touche ...
}
if(repeat == REPEAT_MAX)
  repeat =  0;

}


ça irait smile ?
Auteur de Mode7 Engine pour ti68k
Auteur de F-ZERO for TI68k
Membre de Orage Studio
Mon site perso : http://www.tigen.org/lionela/
Le gite de mes parents à coté de Narbonne :
http://chaletdenis.free.fr/

8

Tu as oublié de réinitialiser repeat à 0 quand on n'appuie pas smile

On peut même gagner un peu en évitant la comparaison à 1 (la comparaison à 0 est plus petite et rapide) :
int repeat = 0; 
 
boucle { 
 
if(_keytest(..) && repeat < REPEAT_MAX-1) {
 if(!repeat) { 
   ... faire des actions correspondant a l'appui sur la touche ... 
 } 
  repeat++; 
} else
  repeat =  0; 

}

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

9

Oups ouais tu as raison, j'ai posté un peu vite tongue
En plus avec ta méthode on doit pouvoir n'utiliser qu'une seule variable repeat pour gerer toutes les touches du clavier (alors que dans la mienne il en fallait une par touche smile)
Auteur de Mode7 Engine pour ti68k
Auteur de F-ZERO for TI68k
Membre de Orage Studio
Mon site perso : http://www.tigen.org/lionela/
Le gite de mes parents à coté de Narbonne :
http://chaletdenis.free.fr/

10

Merci pour votre aide.
En utilisant votre idéé j'ai obtenu un code de ce style :

#define REPEAT_MAX 100000  // A ajuster selon ses besoins.

BOOL AnyKeyPressed(void)
{
  static unsigned long Repeat=0;
  BOOL Result;
  Result=FALSE;
  if(_rowread(0) && Repeat<REPEAT_MAX)
  {
    if(Repeat==0)
    {
      Result=TRUE;
    }
    Repeat++;
  }
  else
  {
    Repeat=0;
  }
  return Result;
}

void _main(void)
{
  INT_HANDLER Save_Int_1;
  INT_HANDLER Save_Int_5;

  Save_Int_1=GetIntVec(AUTO_INT_1);
  Save_Int_5=GetIntVec(AUTO_INT_5);

  SetIntVec(AUTO_INT_1, DUMMY_HANDLER);
  SetIntVec(AUTO_INT_5, DUMMY_HANDLER);

  ...

  while(!END)
  {
    if(AnyKeyPressed())
    {
      if(_keytest(RR_LEFT))
      {
        ...
      }
      if(_keytest(RR_RIGHT))
      {
        ...
      }
      if(_keytest(RR_ESC))
      {
        END=TRUE;
      }
    }
    ...
  }
  ...
  SetIntVec(AUTO_INT_1, Save_Int_1);
  SetIntVec(AUTO_INT_5, Save_Int_5);
}

Voilà ça marche.

11

top
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

12

Eventuellement si tu testes plusieurs touches sur les mêmes rangées, tu seras intéressé par remplacer les _keytest par des _keytest_optimized, ça limite le nombre de lectures du clavier, qui est une opération lente.