π
<-

Gestion du clavier par événements (comme SDL)

C, C++, ASM...

Gestion du clavier par événements (comme SDL)

Unread postby Manger » 17 Feb 2012, 21:47

Bonsoir à tous,

Depuis la sortie de ndless 3 (merci à vous :-)), je me suis mis en tête de programmer un petit programme pour pouvoir utiliser la notation RPN que je trouve assez pratique pour les calculs en physique (on voit tous les résultats intermédiaires et du coup à chaque calcul intermédiaire on a l'occasion de comparer les ordres de grandeur des valeurs sur lesquelles on va opérer). Pas vraiment question de rejoindre l'excellent programme RPN qui existe sur Ti-89, mais juste un petit quelque chose capable de faire des calculs numériques convenablement. Bon, j'ai assez peu de temps en ce moment, donc ça avance très doucement. (et avec un peu de recul, Lua aurait sûrement été plus approprié pour cette tâche... Mais moins rigolo aussi ;-)). (par ailleurs, installer l'émulateur fut une épreuve douloureuse... Pourquoi imgdump.exe est-il si bien caché ? Le programme est-il illégal dans son intégralité ou est-ce seulement une clef de quelques octets ou quelque chose dans le genre qui l'est ? Si tel est le cas, pourquoi pas fournir une version de imgdump qui n'a pas cette clef, sachant que trouver sur internet une suite alphanumériques d'une dizaine de caractères paraît plus facile que trouver un programme ?)

Pour l'instant, j'ai commencé à coder de quoi gérer une boîte de texte dans laquelle on peut taper du texte, se déplacer et supprimer des caractères. En gros, il y a une structure chargée de stocker les données liées à la boîte, une fonction input_draw pour afficher la boîte et une fonction input_callback que l'on devait appeler chaque fois qu'il se passait quelque chose (en général, après un wait_key_pressed()) et qui regardait un peu toutes les touches pour voir ce qui s'était passé. Ça marchait, mais il fallait faire bien attention à ne pas appuyer sur plusieurs touches en même temps lors de la saisie.

J'ai donc voulu coder un système de gestion des événements un peu comme le fait SDL (et sans doutes comme sur Ti-89 si mes souvenirs sont exacts) : à chaque début de boucle (dans le cas d'un jeu) ou à chaque appui de touche (dans le cas d'un programme plus passif), on appelle une fonction event_poll(Event *ev) qui se charge de placer un événement dans le pointeur ev et de renvoyer 1 tant qu'il y a encore des événements à traiter. Pour information, la structure Event se compose de :
1. type : enum {KEYDOWN, KEYUP}
2. key : enum {toutes les touches définies dans common.h avec le préfixe EVKEY_}

Le gros problème est la récupération de ces événements... Deux méthodes :
1. La fonction poll_event est appelée après un wait_key_pressed() et se charge de remplir la pile des événements avec ce qui a bougé depuis la dernière fois. Malheureusement, vu qu'on ne réagit qu'après un appui de touche et pas après la fin d'un appui de touche (ce qui est pourtant très important dès qu'on veut faire des choses un peu subtiles), il est impossible de détecter immédiatement les relâchements.
2. On boucle sur poll_event() quand on a un programme passif, et on boucle sur poll_event() jusqu'à devoir afficher l'image suivante quand on a un jeu. Ça marche très bien ! Je suis certain que les fabricants de piles et de batteries du monde entier se porteraient bien mieux si tout le monde faisait comme ça ;-)

J'imagine que la Ti N-Spire doit consommer beaucoup moins d'énergie lorsqu'on fait une attente passive, d'où, finalement, ma question : y a t'il un moyen d'appeler automatiquement une certaine fonction lors de l'appui sur une touche ou au moins d'endormir le programme jusqu'au moindre petit événement (que ce soit un appui ou un relâchement) ? Si je me souviens bien de mon cours d'architecture, lors de l'appui une interruption doit être produite et une fonction de l'OS est appelée pour traiter cet événement. Peut-être pourrait-on demander à la machine ou à l'OS d'appeler une fonction donnée lors de la réception de l'interruption ? Je n'ai jamais touché à quoi que ce soit de plus bas niveau que du C avec SDL, donc je dis sans doutes n'importe quoi...

Merci et bonne soirée !
User avatar
Manger
Niveau 3: MH (Membre Habitué)
Niveau 3: MH (Membre Habitué)
Level up: 4%
 
Posts: 9
Joined: 10 Sep 2011, 10:09
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Gestion du clavier par événements (comme SDL)

Unread postby Lionel Debroux » 17 Feb 2012, 21:59

Bonsoir ;)

Pourquoi imgdump.exe est-il si bien caché ?

Notamment parce que son(ses) auteurs ont supprimé toute les traces qu'il(s) avai(en)t postées de ce programme :)
Seules certaines versions de la distribution non officielle de l'émulateur que tu as fini par trouver continuent à proposer cette ancienne version d'imgdump, qui ne peut pas de déchiffrer les OS pour les familles CX et CM.

Le programme est-il illégal dans son intégralité

Non.
ou est-ce seulement une clef de quelques octets ou quelque chose dans le genre qui l'est ?

C'est en effet un risque, dans les tous les pays qui accordent une quelconque valeur de "propriété intellectuelle", ou droits voisins, à une suite de quelques dizaines d'octets. Et le(s) auteur(s) d'imgdump vi(ven)t dans de tels pays.

Si tel est le cas, pourquoi pas fournir une version de imgdump qui n'a pas cette clef, sachant que trouver sur internet une suite alphanumériques d'une dizaine de caractères paraît plus facile que trouver un programme ?

Tu fais référence à des contournements similaires à ceux de DeCSS et "09 F9 ..." ? :)
Le(s) auteur(s) d'imgdump les connaissent, mais le fait est qu'ils ne les utilisent pas (pas encore ?).


Sur TI-68k, il y a effectivement un système d'événements qui peut notamment être utilisé pour recevoir des touches, mais rares sont les programmes ASM qui procèdent ainsi, car c'est peu efficace :)


Dans l'API de Ndless, comme dans l'API d'AMS (l'OS standard des TI-68k), il y a idle(). Peut-être que ça fait une partie de ce que tu veux ? :)
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6869
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Gestion du clavier par événements (comme SDL)

Unread postby Manger » 17 Feb 2012, 22:31

Merci pour ces précisions :-) Je comprends mieux le cas d'imgdump maintenant... C'est dommage pour les programmeurs parce que sans émulateur ça doit vraiment être une plaie de faire des tests et de débogger...

Le système d'événements marche assez bien avec SDL ; peut-être que c'est plus optimisé ou qu'on a assez de puissance de calcul et de mémoire pour se permettre ce genre de frioritures...
Dans mon cas, chaque événement implique un malloc() et chaque pop un free() donc ça doit pas être génial ; peut-être que ce serait mieux d'allouer de la mémoire en avance et d'en réserver davantage au cas où l'utilisateur appuie sur 30 touches à la fois...
En tout cas, la fonction idle() marche parfaitement, merci ! J'aurais du lire plus attentivement la page sur libndls... Donc pour un programme qui attend 90% du temps c'est parfait :-) Maintenant, pour un jeu ça doit demander un peu plus de gymnastique puisqu'il faut aussi jouer avec des timer... Si j'ai bien compris cette page, on doit pouvoir jouer sur les timer en bidouillant un peu, mais ça a pas l'air joli joli :-)
Encore merci !
User avatar
Manger
Niveau 3: MH (Membre Habitué)
Niveau 3: MH (Membre Habitué)
Level up: 4%
 
Posts: 9
Joined: 10 Sep 2011, 10:09
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Gestion du clavier par événements (comme SDL)

Unread postby Lionel Debroux » 18 Feb 2012, 08:06

La plupart des programmeurs en code natif sur Nspire utilisent l'émulateur, grâce à imgdump et/ou PolyDumper ( archives_voir.php?id=3829 ) :)

S'ils utilisent imgdump, c'est soit qu'ils avaient récupéré la version capable de déchiffrer les OS pour Clickpad/Touchpad (deuxième version, donc) avant qu'elle ne soit enlevée, soit qu'ils l'ont récupérée depuis, dans la distribution non officielle de l'émulateur.
La première version d'imgdump ne fait que décompresser le boot2 des Clickpad/Touchpad, ce qui ne présente a priori pas de risques légaux; la distribution publique de la deuxième version embarque la clé Blowfish de chiffrage/déchiffrage de l'OS des Clickpad/Touchpad, et c'est pour ça qu'elle a été enlevée par son/ses auteur(s). Et la version qui sait déchiffrer les OS des CX et CM n'est pas distribuée publiquement.

PolyDumper dumpe tout ce qu'il y a à récupérer sur une machine, grâce à l'exécution de code arbitraire.


Pour info, un portage de SDL vers la plate-forme Nspire a commencé: http://www.omnimaga.org/index.php?topic=12378.0 :)
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6869
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Gestion du clavier par événements (comme SDL)

Unread postby Manger » 18 Feb 2012, 18:46

Après avoir un peu galéré et essayé un peu tout sur les fichiers que j'avais trouvé (boot1 et boot2 récupérés avec polydumper et d'autres récupérés d'un OS 2.1) et un imgdump que j'ai trouvé un peu au hasard, j'avais réussi à faire tourner l'émulateur. S'il fallait passer par le logiciel de Ti à chaque fois qu'il fallait faire un test et resetter la calculatrice une fois sur trois à cause d'un plantage ça serait vite devenu douloureux ;-)

Je ne savais pas qu'il y avait un portage de SDL en cours ; c'est en effet vraiment intéressant, merci :-)
User avatar
Manger
Niveau 3: MH (Membre Habitué)
Niveau 3: MH (Membre Habitué)
Level up: 4%
 
Posts: 9
Joined: 10 Sep 2011, 10:09
Gender: Not specified
Calculator(s):
MyCalcs profile


Return to Native: Ndless, Linux, ...

Who is online

Users browsing this forum: ClaudeBot [spider] and 5 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1484 utilisateurs:
>1468 invités
>10 membres
>6 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)