1

Ça fait plusieurs années que je voulais recompiler un programme pour le diffuser, et après avoir installé GCC4TI et compiler mon programme, j'ai des drôles de comportements avec la gestion des touches. Quand j'appuie sur une touche il arrive que l'action associée s'exécute deux fois et je n'arrive pas à reproduire ce phénomène sur VTI.

J'ai plusieurs théories :
- C'est pas du tout la bonne façon de coder ce genre de truc^^
- Ma calculatrice n'a plus marché depuis plusieurs années et il y a des faux contacts avec les touches
- Il y a un bug avec GCC4TI

Voici un exemple sur lequel je reproduis mon problème :// C Source File // Created 11/05/2013; 12:04:39 #include <tigcclib.h> INT_HANDLER OldInt1 = NULL; INT_HANDLER OldInt5 = NULL; // Main Function void _main(void) { OldInt1 = GetIntVec( AUTO_INT_1 ); OldInt5 = GetIntVec( AUTO_INT_5 ); SetIntVec( AUTO_INT_5, DUMMY_HANDLER ); SetIntVec( AUTO_INT_1, DUMMY_HANDLER ); int i = 0; while( ! _keytest(RR_ESC) ) { if( _keytest(RR_LEFT) ) { printf( ".%d", i ); while( _keytest(RR_LEFT) ); i++; } } SetIntVec( AUTO_INT_1, OldInt1 ); SetIntVec( AUTO_INT_5, OldInt5 ); }
Dans cet exemple, en appuyant une seule fois (appui puis relachement) sur gauche, il arrive d'avoir ".1.2" qui apparait...

Des idées ?
Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici

2

_keytest (comme _rowread (que _keytest utilise en interne)) n'est pas fait pour détecter des appuis de touches, mais des états de touches (la touche est-elle actuellement appuyée ou non, utile surtout dans les jeux d'action). Il n'y a aucun "debouncing" qui est effectué.

Je conseille de travailler plutôt avec OSdequeue sur kbd_queue.

(Et sinon, je conseille aussi d'utiliser le TIGCC original.)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3

Question con, ce n'est qu'un exemple ok, mais pourquoi avoir OldInt1 et OldInt5 en global ? Et pourquoi les initialiser à NULL ?

4

Je suis bien d'accord, le seul soucis est que j'ai besoin de tester des combinaisons de touches (comme 2ND + CLEAR + ENTER), comment gérer ces cas ?
Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici

5

Je ferais un truc comme ça :bool Combo = false; if (Combo && !(keytest (2nd) && _keytest (clear) && !_keytest (enter)) Combo = false; if (!Combo && _keytest (2nd) && _keytest (clear) && _keytest (enter)) { Combo = true; ..... }

6

Si tu veux éviter de dupliquer le code de test des touches :static bool EtatComboPrec = false; { bool EtatCombo = _keytest (2nd) && _keytest (clear) && _keytest (enter); if (EtatCombo && (!EtatComboPrec)) { ... } EtatComboPrec = EtatCombo; }
Ceci dit, comme le dit Kevin, ça ne gère pas le debouncing. Donc il faut, au minimum, ne pas exécuter ce code plus d'une fois toutes les x ms (je ne sais pas quel est la valeur optimale pour le clavier de la TI, mais 20 ms est un bon choix dans la plupart des cas).
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

7

bien uv !