[C] Gestions du clavier / Fin d'un Add-in
Posté le 16/02/2017 00:23
Tout d'abord, bravo à tous ceux qui participent, vous aidez pas mal de personnes silencieuses. (eh oui, c'est mon premier message, il fallait que je vous le dire).
Je vais raconter ma vie là, passez ce paragraphe si vous avez pas 2 heures
!
Propriétaire d'une Graph35+E et agacé de la lenteur d’exécution du Basic Casio en ViewWindow (même si ça a occupé de nombreuses heures de cours, et oui j'optimise sans doute pas du tout), j'ai décidé de m'intéresser directement aux Add-in, bien plus "puissant". Améliorer la calculatrice en 75+E, télécharger le SDK, l'updater pour le SH4, etc, tout a été fait très facilement grâce à ce magnifique site, MAIS.
1ère remarque :
Après la
config du SDK pour la compatibilité SH4, il n'y a plus de "modèle de programme" quand on créé un nouveau projet. Voilà, pas grand chose de grave, juste une remarque ^^.
Ensuite, 1ère vrai question :
Quelles sont les valeurs des touches du clavier de Fxlib.h ?
Sur la doc de la bibliothèque, il est bien mentionné pour GetKeyWait : "Cette fonction attend l'appui d'une touche et
donne sa valeur".
Ce sont les mêmes valeurs que pour le Getkey du basic ? (par exemple [EXE] = 31 ?)
EDIT : J'ai vu des bibliothèques non-officiel comme
libinput qui ont l'air vachement plus simple pour gérer le clavier, mais j'aimerai bien commencer simplement avec juste Fxlib.
2ème question :
Comment se "termine" un Add-in ?
Je sais que ça peut paraître bizarre, mais si je veux faire un Add-in avec un déroulement linéaire et possédant une fin (qui renvoi au Menu), à chaque fois qu'il est fini, impossible de le relancer. Il faut pour cela lancer autre chose, puis enfin l'Add-In daignera s'ouvrir.
J'ai essayé avec un SetQuitHandler, mais ça n'aide pas. Si y'a une explication / solution, j'aimerai bien comprendre !
Voilà pour le long post, merci d'avoir lu !
Citer : Posté le 16/02/2017 00:50 | #
Quelles sont les valeurs des touches du clavier de Fxlib.h ?
Le lien que tu as mis a l'air de mettre les fonctions pour se servir directement du clavier. Du coup, tu as deux cas à gérer (tu peux n'en implémenter qu'un si tu as la flemme) : les claviers normaux, et les slims. Les codes sont ici (en hexa, par exemple, EXIT c'est 0x37) :
https://bible.planet-casio.com/simlo/chm/v20/fx_legacy_keyboard.htm
Comment se "termine" un Add-in ?
En fait, tout se fait grâce au syscall Getkey : si la touche MENU est détectée, cela revient au menu, mais l'application tourne toujours. C'est seulement lorsqu'une autre application est sélectionnée que l'add-in est terminé (et, j'imagine, le Quit Handler appelé). Bon, du coup, ici, tu lis directement le clavier et tu ne te sers pas du syscall, mais si quelqu'un a l'habitude du SDK (ce n'est pas mon cas), il pourra poster un lien vers le workaround ici.
L'autre façon de terminer un add-in, la "sale" (en fait pas vraiment, mais en considérant la manière dont la gère l'OS, si), c'est effectivement d'arriver à la fin du programme. Souci : si tu sélectionnes l'add-in à nouveau, cela ne rentrera pas dedans à nouveau, il faut sélectionner une autre application puis revenir sur ton add-in pour le relancer. En prenant le paragraphe précédant en compte, tu devrais aisément pouvoir comprendre pourquoi
Mon blog ⋅ Mes autres projets
Citer : Posté le 16/02/2017 07:44 | #
Quelques remarques supplémentaires :
- Les codes normaux de GetKey() et GetKeyWait() sont définis dans le pdf fx9860g_character_set.pdf, téléchargé avec le SDK ;
- Il y a des valeurs numériques associées, définies dans le header keybios.h, mais il est tout à fait déconseillé de les utiliser directement ;
- Le fichier SH4Comp.c modifie ces valeurs et les remet plus ou moins aux valeurs du Basic, d'où la nécessité de ne pas s'appuyer sur les valeurs directement mais sur les noms ;
- La fonction GetKeyWait() ne marche pas, elle renvoie systématiquement 0 au lieu de la valeur de la touche. Il existe des alternatives mais elles sont compliquées et changent encore les valeurs ;
- Il existe deux manières supplémentaires d'autoriser le retour dans l'application : appeler GetKey() en ayant préalablement injecté MENU, ou bien modifier un flag dans la RAM.
Citer : Posté le 16/02/2017 08:40 | #
La manière de revenir au Menu sera toujours moche
Citer : Posté le 16/02/2017 12:11 | #
Pas nécessairement. Le retour au menu quand le programme s'arrête n'a rien de moche, et bien que non documenté (et pas intégré à l'API de fxlib), le flag de RAM pourrait être spécifiquement prévu pour ça. Auquel cas, il fournit une solution parfaitement propre. À mon sens, c'est de loin ce qu'il y a de mieux.
Citer : Posté le 16/02/2017 12:39 | #
Pour sortir, il te faut juste modifier un flag de la RAM ? Ca m'intéresse, dis-m'en un peu plus (si tu le sais)
Citer : Posté le 16/02/2017 12:46 | #
Il faut passer un short à 1 quelque part dans la RAM, c'est tout. Le système nous laisse redémarrer un add-in juste arrêté. Je m'en suis servi une ou deux fois.
Vois les commentaires de SimLo sur le syscall 0x049a.
Citer : Posté le 16/02/2017 19:34 | #
- Les codes normaux de GetKey() et GetKeyWait() sont définis dans le pdf fx9860g_character_set.pdf, téléchargé avec le SDK ;
Ah oui, au lieu de rechercher partout sur Internet, j'aurais mieux fait de regarder ce que j'avais sous mon nez ^^.
- Il y a des valeurs numériques associées, définies dans le header keybios.h, mais il est tout à fait déconseillé de les utiliser directement ;
On va oublier les valeurs numériques du coup !
- La fonction GetKeyWait() ne marche pas, elle renvoie systématiquement 0 au lieu de la valeur de la touche
De toute façon j'utilise GetKey() (pour l'instant, je débute !)
En fait, tout se fait grâce au syscall Getkey : si la touche MENU est détectée, cela revient au menu, mais l'application tourne toujours
J'utilise GetKey, donc le problème est réglé.
Merci de votre aide !