Forums Casio - Projets de programmation

Index du Forum > Projets de programmation > gint : un environnement de développement d'add-ins
Lephenixnoir
Hors ligne
Administrateur
Points: 11853
Défis: 136
Message
Posté le 20/02/2015 17:30

gint : un environnement de développement d'add-ins :

En général, quand on veut écrire un add-in, on dégaine le fx-9860G SDK de Casio et sa bibliothèque fxlib, ou bien le PrizmSDK si la calculatrice visée est en couleurs.

gint est une alternative à tout ça. C'est un environnement de développement qui fonctionne sous Linux (et avec un peu de travail sous Windows) et vous permet de créer des add-ins avec gcc et sa suite. Il marche bien sur Graph monochromes, et je suis en train de le porter sur Graph 90. Un joli programme !

Comparé aux SDKs habituels, gint est plus proche du matériel et contrôle donc le clavier, l'écran ou l'horloge avec plus de finesse. Concrètement, ça veut dire que vous pouvez appuyer sur plusieurs touches à la fois, faire exécuter une fonction toutes les 5 ms, ou ne rafraîchir que la moitié de l'écran.

gint sur Graph monochrome



gint existe sur Graph monochrome depuis un moment et le cœur de la bibliothèque arrivera bientôt à sa version finale.

Comparé à fxlib, vous pouvez faire ce genre de joyeusetés...
– Des graphismes en 4 couleurs avec le moteur de gris
– Un contrôle détaillé du clavier pour les jeux
– Des timers avec une précision entre 30 µs à 60 ns
– Des fonctions de dessin de texte et d'image fulgurantes
– La conversion automatique des images dans votre Makefile
– La compatibilité SH3 et SH4 sans avoir à modifier les sources.

L'inconvénient principal est que vous devez inclure le code de gint dans votre add-in. Ça coûte environ 30 ko, que vous pouvez comparer au 18 ko de sprintf() quand vous utilisez le SDK !

gint sur Graph 90



gint était à l'origine conçu pour Graph 85. J'avance tranquillement sur le portage avec la Graph 90, mais ça demande de changer pas mal le code. Pour l'instant, j'arrive à faire des choses simples :
– Installer gint et remplacer le gestionnaire d'interruptions
– Communiquer avec l'écran (méthode lente et non finale)
– Utiliser les 9 timers disponibles
– Configurer la RTC (horloge) et l'utiliser comme un timer

Si vous avez déjà programmé une Prizm, vous savez qu'il y a une bande blanche dans laquelle on ne peut rien afficher. Ce genre de choses se contourne bien avec gint, comme le montre la photo

Tester gint sur une Graph monochrome

Si vous avez un moment, je suis toujours à la recherche de tests pour vérifier que tout marche bien. Vous en avez pour 15 minutes environ !

1. Transférez l'add-in de test de gint (téléchargeable ici), sur votre machine, et lancez-le en maintenant EXE appuyé. L'écran de contrôle (image 1) apparaît.
2. Notez ses contenus quelque part pour me les envoyer. S'il n'y a pas "Boot OK" en haut à droite, faites un RESET et arrêtez là, car gint ne fonctionne pas. Sinon, appuyez sur une touche.
3. Effectuez les différents tests de l'onglet TEST. N'hésitez pas à signaler ce qui peut vous sembler bizarre !


Images 1 et 2 : L'écran de contrôle de gint, et le menu principal

Keyboard & events : vous devez pouvoir appuyer sur 3 ou 4 touches simultanément et visualiser des nom et nombre de répétition corrects, même si vous suivez des séquences exotiques. Vous pouvez voir le shadowing en constant que Left + Down + SHIFT déclenche ALPHA.
Gray engine : vérifiez que le réglage initial (DEFT) est satisfaisant pour un contraste moyen. Vous pouvez jouer avec les délais et voir comment l'illusion varie.
Image rendering : les images doivent s'afficher correctement dans tous les positions, mêmes si elles dépassent de l'écran.
Text rendering : vous devez voir les 6 lignes de 32 caractères en entier pour chaque police.
Real-time clock : l'horloge doit avancer seconde après seconde. Mettez-la à l'heure ou modifiez légèrement l'heure indiquée : le réglage doit persister.
Clocks and timers : dans l'onglet TIME, le timer et l'horloge doivent avancer sensiblement à la même vitesse.

4. Placez-vous ailleurs que dans le menu principal, appuyez sur MENU et vérifiez que vous retournez bien au menu de la calculatrice. Retournez dans l'application de test, vous devez réapparaître à l'endroit où vous l'aviez laissée.
5. Envoyez-moi vos résultats par un message sur ce topic. Et soyez remerciés !

Installer et utiliser gint sur votre système, pour développer

L'utilisation normale de gint est en l'associant avec le fxSDK, qui fournit les options de compilation/édition des liens appropriées, le linker script particulier de gint ainsi que les outils de conversion compatibles avec la bibliothèque. Si vous voulez utiliser le fxSDK tout entier (recommandé), suivez ses instructions d'installation, gint est fourni avec.

Une fois que gint est installé sur votre système, voyez les tutoriels de développement pour avoir un aperçu de son fonctionnement. La plupart des choses sont expliquées dans les en-têtes (fichiers .h) de la bibliothèque. Ils sont tous dans le sous-dossier gint du dossier d'installation du fxSDK, que vous pouvez afficher en exécutant fxsdk --folder.

Si vous voulez utiliser directement gint sans le fxSDK (soyez sûrs que vous savez ce que vous faites), vous pouvez ou télécharger l'archive, ou le compiler à la main. Notez que la compilation requiert quand même le fxSDK... pas besoin de l'installer par contre, il vous suffit de placer fxsdk/bin dans le PATH après compilation.

$ git clone "http://git.planet-casio.com/lephe/gint" && cd gint
$ ./configure --startup-log # Ce que vous voulez
$ make all-lib

Ici aussi, vous ne voudrez probablement pas l'installer, juste linker la bibliothèque. Je rappelle que l'ordre de linkage compte, et que vous devez absolument compiler avec gcc <options> <objets...> -lgint -lc -lgcc, et dans cet ordre.


Comment ça marche

gint est essentiellement organisé autour d'un gestionnaire d'interruptions, une routine qui répond aux signaux émis par les composants pour signaler des événements intéressants (décompte du temps, timer arrivé à expiration, touches du clavier pressées, données reçues sur le port série... entre 20 et 40 sources différentes sur la calculatrice). Normalement c'est le système qui fournit le sien, mais gint le change parce qu'il a besoin de le contrôler pour implémenter ses fonctionnalités et se rendre indépendant de fxlib.

Une fois qu'on contrôle les interruptions, installer un moteur de gris avec un timer à deux délais est un jeu d'enfant. Le moteur de Kucalc (Revolution-FX) ne les contrôlait pas, et devait toutes les supprimer sauf celle du timer, désactivant du même coup les autres timers, l'horloge, la fonction GetKey()... tout un dérangement qui se soldait par un redémarrage à la fin de l'exécution.


Fichier joint



Lephenixnoir
Hors ligne
Administrateur
Points: 11853
Défis: 136
Message
Dernier message de la page précédente :Posté le 04/08/2018 23:49 |
Seulement ça se complique au fur et à mesure que tu optimises... mais oui, à essayer.

Accessoirement tu peux récupérer le driver timer et basta. En l'occurrence gint n'est dans le principe pas nécessaire. L'OS peut emmerder mais avec un peu de chance non.
----------------------------------
Rise.



Pages: Précédente | 1 ... , 6, 7, 8, 9, 10, 11, 12 | Suivante

Zezombye
En ligne
Rédacteur
Points: 1250
Défis: 12
Message
Citer : Posté le 05/08/2018 00:41 | #
Pourquoi tu pourrais pas compiler windmill sous gint ?
----------------------------------
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
-florian66-
Hors ligne
Ancien rédacteur
Points: 2292
Défis: 19
Message
Citer : Posté le 05/08/2018 08:36 | #
Tu as release le nouveau gestionnaire d'interruption ? Si oui, je ferai quelques tests de son sur S4C
----------------------------------
In Arch, I trust ! And you ?
Lephenixnoir
Hors ligne
Administrateur
Points: 11853
Défis: 136
Message
Citer : Posté le 05/08/2018 10:46 | #
Zezombye a écrit :
Pourquoi tu pourrais pas compiler windmill sous gint ?

GCC semble optimiser des choses dans le code de Windmill, et bien que ça compile, ça ne marche pas. En général c'est que le code oublie de préciser des « contraintes » et le compilateur saute dessus pour optimiser plus, mais finit par casser le programme. Avec le SDK le problème ne se pose pas parce qu'il n'optimise rien...

-florian66- a écrit :
Tu as release le nouveau gestionnaire d'interruption ? Si oui, je ferai quelques tests de son sur S4C

Tu peux toujours pull la branche compat du dépôt, mais il n'y a pas de clavier...
----------------------------------
Rise.
Drak
Hors ligne
Rédacteur
Points: 1458
Défis: 38
Message
Citer : Posté le 05/08/2018 11:52 | #
N'est-il pas possible de compiler en précisant de n'opérer aucune optimisation ?
----------------------------------
Eon the Dragon : version 1.2
Let's have a look!
Marre de ces RPGs qui t'imposent des classes, des compétences et des sorts ? Crée tes propres capacités sur Eon the Dragon ! Des monstres, des dragons et des combats aussi épiques que difficiles t'attendent !
Mon projet Basic : Un Grand RPG vous attend ! et sa version Demo ici !
Vous aussi, soyez swag et rejoignez Planète Casio !
Lephenixnoir
Hors ligne
Administrateur
Points: 11853
Défis: 136
Message
Citer : Posté le 05/08/2018 11:56 | #
Je l'ai fait, de mémoire, mais même de base, il ne reste pas passif. C'est peut-être un truc à la con qui bloque ?

Ajouté le 09/08/2018 à 16:18 :
Pas de progrès immédiat à annoncer, mais je travaille sur le clavier, sur SH4 le principe (acquérir les touches pressées) marche.

Maintenant j'essaie de structurer le programme autour correctement. J'ai un buffer dans lequel je peux stocker :
- Soit l'historique des états de clavier
- Soit les évènements (touche pressée, maintenue, relâchée...)

Jusque-là j'étais sur l'historique des états mais le buffer n'a qu'une seconde de capacité même quand il ne se passe rien. C'est gênant. Un buffer d'évènements ne se remplit pas s'il ne se passe rien... c'est plus avantageux.

J'envisage également de générer au lieu de stocker les événements de répétition de touches, c'est à étudier.

Au milieu de tout ça il reste qu'il faut être précautionneux dans le design parce que si par exemple l'instant où je relâche une touche est manqué (parce que le buffer est plein donc l'information est perdue par exemple), la touche risque de ne jamais être considérée comme relâchée. Si on s'y prend correctement ce genre de problèmes se corrigent spontanément, mais ça demande un peu de soin.

Voilà pour cette petite update
----------------------------------
Rise.
Dark storm
En ligne
Administrateur
Points: 10388
Défis: 174
Message
Citer : Posté le 09/08/2018 22:13 | #
Ok. Quoi qu'il arrive, tu nous tiens au jus, suivant l'implémentation finale (ça a changé pas mal de fois il me semble ) ça changera l'architecture des projets. (J'ai toujours Osu! sur le feu, j'avance doucement mais sûrement, pour l'instant y'a pas de quoi nourrir une RDP, donc j'attends encore un chouille)
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Lephenixnoir
Hors ligne
Administrateur
Points: 11853
Défis: 136
Message
Citer : Posté le 09/08/2018 22:19 | #
No problem pour le jus ! Je sais que j'ai tendance à changer assez vite mes APIs, il faudra que je m'adapte quand ce sera release et utilisé... o_o"
----------------------------------
Rise.
Dark storm
En ligne
Administrateur
Points: 10388
Défis: 174
Message
Citer : Posté le 12/08/2018 21:10 | #
Bon, c'est un peu chiant, mais du coup voilà.

Procédure d'installation
$ git clone git@git.planet-casio.com:lephe/gint.git
$ cd gint
$ ./configure
$ make
# make install


Compilation (à partir des sources de Calto Hero, qui compilaient y'a pas si longtemps)
$ make
sh3eb-elf-gcc build/src/editor.c.o build/src/main.c.o build/src/load.c.o build/src/engine.c.o build/src/bfile.s.o build/assets/font-island.bmp.o build/assets/game-background.bmp.o build/assets/balls.bmp.o build/assets/explosion.bmp.o `fxsdk --libs` -o build/calthero.elf `fxsdk --cflags` -std=c11 -Wall -Wextra -pedantic
/usr/bin/sh3eb-elf-ld: cannot find build/version.o


Il se trouve que l'erreur survient aussi sur un projet bidon :
[darks@walhalla test]$ cat main.c
int main(int a, void *args) {
    return 1;
}

[darks@walhalla test]$ sh3eb-elf-gcc -c main.c -o main.o `fxsdk --cflags` -std=c11 -Wall -Wextra -pedantic
main.c: In function 'main':
main.c:1:14: warning: unused parameter 'a' [-Wunused-parameter]
int main(int a, void *args) {
          ~~~~^
main.c:1:23: warning: unused parameter 'args' [-Wunused-parameter]
int main(int a, void *args) {
                 ~~~~~~^~~~

[darks@walhalla test]$ sh3eb-elf-gcc main.o `fxsdk --libs` -o addin.elf `fxsdk --cflags` -std=c11 -Wall -Wextra -pedantic
/usr/bin/sh3eb-elf-ld: cannot find build/version.o
collect2: error: ld returned 1 exit status


À l'inverse, un make all dans le dossier de gint fonctionne (si ce n'est que j'ai pas le bon wrapper dans mon path).
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Lephenixnoir
Hors ligne
Administrateur
Points: 11853
Défis: 136
Message
Citer : Posté le 12/08/2018 21:29 | #
J'arrive à reproduire le bug. Je regarde plus en détail.

Ajouté le 12/08/2018 à 21:34 :
Le linker script mentionnait ce fichier. J'ai toujours cru que c'était « s'il existe », mais apparemment pas.

J'ai adapté et commit un fix qui semble passer. Tu peux confirmer ?
----------------------------------
Rise.
Dark storm
En ligne
Administrateur
Points: 10388
Défis: 174
Message
Citer : Posté le 12/08/2018 21:39 | #
C'est tout bon o/

Au passage, tu peux publier le wrapper sur le Gitlab ?
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Lephenixnoir
Hors ligne
Administrateur
Points: 11853
Défis: 136
Message
Citer : Posté le 12/08/2018 21:41 | #
Dark storm a écrit :
Au passage, tu peux publier le wrapper sur le Gitlab ?

J'aimerais éviter, si possible. Il a besoin d'être réécrit, pour être honnête... normalement il devrait être intégré au fxSDK une fois que c'est fini.

Ajouté le 14/08/2018 à 14:10 :
J'ai réussi à écrire le système d'enregistrement des évènements du clavier.

En fait je l'ai fait sous trois formes différentes sans réussir à me débarrasser d'un bug gênant et non trivial. Basiquement, quand on presse beaucoup de touches et qu'on les relâche, certains relâchements ne sont pas pris en compte.

Si je lis dans les registres du KEYSC ce qu'il en est depuis l'interruption qui analyse le clavier, il dit que les touches en question sont toujours pressées. Si je le fais hors de l'interruption, il dit qu'elles ne le sont pas et le bug disparaît.

Je l'ai déjà rencontré il y a quelques années, et le « contournement » que j'avais mis en place est la raison pour laquelle le clavier ne marche plus quand on overclocke dans les versions actuelles de gint.

Je continue de chercher mais ça s'annonce assez bizarre, je n'ai pas encore d'idée d'où ça peut venir.

Ajouté le 14/08/2018 à 15:34 :
Croyez-le ou pas, j'arrive à contrôler l'apparition du bug en fonction de l'espace où mon driver fais les analyses du clavier : depuis une interruption, j'ai des artefacts, mais depuis le programme utilisateur, rien. Je continue de chercher... '-'
----------------------------------
Rise.
Dark storm
En ligne
Administrateur
Points: 10388
Défis: 174
Message
Citer : Posté le 15/08/2018 01:01 | #
Au passage, est-ce que tu peux préciser les bons paramètres d'enregistrement (méthode pour Gimp par exemple) pour que fxconv fasse pas du caca ?
Impossible d'afficher un foutu sprite en N&B + alpha

Genre, les paramètres pour :
– les sprites, N&B, N&B+A
– les polices, N&B
– les sprites, 4G, 4G+A

Ajouté le 15/08/2018 à 01:04 :
Je précise que ça vient vraiment de fxconv, parce que si je mets un lien symbolique vers un sprite de gintdemo, il s'affiche. C'est une question de paramètres d'enregistrement uniquement.
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Lephenixnoir
Hors ligne
Administrateur
Points: 11853
Défis: 136
Message
Citer : Posté le 15/08/2018 08:33 | #
Pour les sprites, normalement :
- Bitmap uniquement.
- RGB888, ARGB8888, RGB565 ou monochrome.
- fxconv détecte automatiquement s'il y a besoin d'ajouter un calque de transparence (si l'image contient des pixels transparents) ou s'il faut passer en gris.
- Les gris sont #555555 et #aaaaaa.

Pour les polices :
- Il y a un header où on doit dessiner du texte, c'est super pas pratique à utiliser, je veux pas garder ce système.
- Copie l'en-tête depuis une police déjà prête, genre celle dans gint/src/display, et change juste la taille des glyphes.
- La police est faite de lignes qui sont séparées par une ou plusieurs lignes blanches consécutives sur toutes la largeur de l'image.
- Chaque ligne est faite de glyphes séparés par une ou plusieurs colonnes blanches consécutives sur toute la hauteur de la ligne.
- Les pixels gris sont autorisés, affichés comme blanc mais ne participent pas à ses démarcations (vois ").

Si ça ne marche pas, fais donc voir les images ; je n'ai jamais rencontré le moindre problème donc c'est certainement arrangeable.
----------------------------------
Rise.
Dark storm
En ligne
Administrateur
Points: 10388
Défis: 174
Message
Citer : Posté le 15/08/2018 10:30 | #
Les polices c'est ok (coup de chance ? Aucune idée…) mais pour les sprites j'ai toujours un bel écran blanc.

Je te laisse faire mumuse avec cette ligne et les images présentes dans le projet.
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Lephenixnoir
Hors ligne
Administrateur
Points: 11853
Défis: 136
Message
Citer : Posté le 15/08/2018 11:02 | #
Je clône, j'envoie ton g1a, j'ai isometric.bmp qui s'affiche à l'écran.

Je n'ai même pas recompilé.

Ça marche sur ma Graph 35+ SH3 et ma Graph 75+E SH4.

... tu es sûr que tout va bien de ton côté ?
----------------------------------
Rise.
Dark storm
En ligne
Administrateur
Points: 10388
Défis: 174
Message
Citer : Posté le 15/08/2018 11:03 | #
Justement, isometric c'est l'image que j'ai piqué de gint, c'est la seule qui fonctionne

— Edit —
J'avoue, j'ai pas été clair pour le coup
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Lephenixnoir
Hors ligne
Administrateur
Points: 11853
Défis: 136
Message
Citer : Posté le 15/08/2018 11:15 | #
Hmm, curieusement le RGB888 contente mieux fxconv. C'est pas normal en tous cas.

J'ai passé tes images dans le bon format, retiré de l'index les fichiers de build et commit tout ça. Le nouveau g1a devrait donner ce que tu veux.
----------------------------------
Rise.
Dark storm
En ligne
Administrateur
Points: 10388
Défis: 174
Message
Citer : Posté le 15/08/2018 11:18 | #
« J'ai passé tes images dans le bon format » À savoir ? Je vais avoir pas mal de sprites, je vais pas te demander de tous les faire
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Lephenixnoir
Hors ligne
Administrateur
Points: 11853
Défis: 136
Message
Citer : Posté le 15/08/2018 11:19 | #
Eh bien, RGB888. Gimp te propose ça dans "Advanced options" quand tu exportes en bitmap.
----------------------------------
Rise.
Dark storm
En ligne
Administrateur
Points: 10388
Défis: 174
Message
Citer : Posté le 15/08/2018 11:22 | #
Bizarre, il me semblait que tu perdais la transparence avec ça. Bref, je regarderai en détail ce soir.
Merci pour le coup de main
----------------------------------
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya

Pages: Précédente | 1 ... , 6, 7, 8, 9, 10, 11, 12 | Suivante

Index du Forum > Projets de programmation > gint : un environnement de développement d'add-ins

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2018 | Il y a 28 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire indépendant, géré bénévolement et n'est donc pas affilié à Casio | Toute reproduction de Planète Casio, même partielle, est interdite
Les fichiers, programmes et autres publications présents sur Planète Casio restent la propriété de leurs auteurs respectifs et peuvent être soumis à des licences ou des copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd