Seuls les membres ayant 30 points peuvent parler sur le chat.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » gint : un noyau pour développer des add-ins
LephenixnoirHors ligneAdministrateurPoints: 16442 Défis: 140 Message

gint : un noyau pour développer des add-ins

Posté le 20/02/2015 17:30

Les SDKs classiques pour écrire des add-ins sont le fx-9860G SDK de Casio avec fxlib (pour Graph monochrome) et le PrizmSDK avec libfxcg (pour Prizm et Graph 90+E). Voici mon alternative : le fxSDK avec gint, pour toutes les plateformes.

Contrairement à fxlib et libfxcg, qui appellent les fonctions de l'OS pour faire leur travail, gint est un noyau indépendant de l'OS qui exploite seul le matériel et le met à disposition de votre add-in. Il vous offre plus de finesse sur le contrôle du matériel, notamment le clavier, l'écran et les horloges, de meilleurs performances sur le dessin, les drivers et la gestion de interruptions, et des choses entièrement nouvelles comme le moteur de gris.

Toutes les sources de gint sont publiques et accessibles sur la forge de Planète Casio :

» Dépôt Gitea Lephenixnoir/gint «

Voici plus précisément ce que gint vous offre de nouveau :

• Un contrôle détaillé du clavier pour les jeux, parfait pour les combos !
• Des timers avec une précision de 60 ns, d'autres à 30 µs
• Toutes vos images converties automatiquement sans code à copier (plus de Sprite Coder)
• Des polices personnalisées
• Des fonctions de dessin, d'images et de texte fulgurantes et optimisées la main
• Mesurer les performance de votre code à la microseconde près (avec libprof)
• Le contrôle du matériel et des interruptions
• Plein de petites choses pratiques comme dprint(1, 1, "x=%d", x)

• (Graph monochrome) Un moteur de gris pour faire des jeux en 4 couleurs !
• (Graph monochrome) La compatibilité SH3 et SH4, avec le même fichier g1a.

• (Graph 90+E) Une nouvelle police de texte, plus lisible et économe en espace
• (Graph 90+E) Le dessin en plein écran, sans les bordures blanches et la barre de statut !
• (Graph 90+E) Un driver écran capable de triple-buffering

Le coût de tout ceci, c'est que vous avez une copie du code de gint dans votre add-in. Cela prend environ 20 ko de place (selon la quantité de fonctions que vous utilisez), soit à peu près comme le sprintf() de fxlib qui fait 18 ko !

Et voici quelques photos et captures d'écran !





Tester gint sur votre machine

La fin du portage vers la Graph 90+E signera la sortie de gint v2. L'add-in de test de l'application est désormais gintctl :

» Dépôt Gitea Lephenixnoir/gintctl «

En plus de tester les fonctionnalités de gint, cet add-in contient quelques outils permettant d'inspecter la machine, la mémoire, et les registres. Je le développe au fur et à mesure, et je posterai un protocole de test complet avec la sortie de la v2 !

Utiliser gint pour développer des add-ins

Normalement, vous avez besoin du fxSDK pour développer avec gint. Le fxSDK est compatible avec Linux et Mac OS, et on peut réfléchir à un portage sous Windows s'il y a vraiment des intéressés. Il faut l'installer en premier (et avoir un cross-compilateur GCC).

La procédure de compilation et d'installation de gint est décrite sur le README du dépôt, c'est du configure - make tout à fait banal.

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 que vous pouvez consulter en ligne, sur votre copie locale du dépôt, ou dans les dossiers d'installation du compilateur.

Obtenir la dernière version de gint après une mise à jour

Je pousse régulièrement des mises à jour de gint sur le dépôt du projet. Pour les télécharger, tapez git pull, puis recompilez et réinstallez gint avec make et make install.


Fichier joint


Pages : Précédente1 ... , 21, 22, 23, 24, 25, 26, 27, 28, 29, 30Suivante
MilangHors ligneMembrePoints: 383 Défis: 2 Message

Citer : Posté le 24/10/2019 14:56 | #


J'ai une question :
Est-il possible d'associer une fonction qui doit être obligatoirement exécutée à la fin d'un callback ?
Je sais qu'il est possible de forcer le programmeur à la mettre, mais existe-t-il plus raffiné ?

En fait j'aimerais qu'une fonction remette une variable dans un état particulier à la fin de l'interruption, en l'occurence se placer dans une vram particulière, sans que la personne ait à se soucier de ce détail. (ici c'est pour faire du double buffering)
LephenixnoirHors ligneAdministrateurPoints: 16442 Défis: 140 Message

Citer : Posté le 24/10/2019 15:43 | #


À la fin d'un callback de timer ? Ça me surprendrait que tu aies envie de rendre l'appel automatique. Après tout, ça va se faire exécuter 128 fois par seconde lors des analyses du clavier.

Peux-tu préciser en quoi ce serait différent d'appeler la fonction en question avant de return du callback ?

Je veux bien savoir aussi quel genre de double buffering tu veux faire, car il y en a déjà dans gint...
MilangHors ligneMembrePoints: 383 Défis: 2 Message

Citer : Posté le 24/10/2019 16:08 | #


En fait le programme se construirait sous la forme suivante :
Il y a un thread qui effectue en permanence le rendu 3d
À côté de ça, il y a le jeu qui est appelé à intervalles réguliers par le timer, et qui se charge d'afficher les frames, ainsi que l'interface ingame.
Cependant, pour éviter d'avoir deux frames qui se superposent, l'utilisateur se base sur la dernière frame dessinée par le moteur, et non celle que le moteur est en train de préparer. C'est pour ça qu'il me faudrait utiliser du triple buffering (double en plus de celui de gint).

Du coup, la fonction qui serai appelée à la fin du callback remettrait le bon buffer en écriture.
LephenixnoirHors ligneAdministrateurPoints: 16442 Défis: 140 Message

Citer : Posté le 24/10/2019 16:09 | #


Hmm, comme sur la Graph 90 donc. Je vois.

Du coup, la fonction qui serai appelée à la fin du callback remettrait le bon buffer en écriture.

Et donc, pourquoi tu ne l'appelles pas simplement avant de return du callback ?
MilangHors ligneMembrePoints: 383 Défis: 2 Message

Citer : Posté le 24/10/2019 16:11 | #


tout simplement parce que le callback peut se terminer à de nombreux endroits, et je voulais savoir si il était possible d'alléger l'écriture.
LephenixnoirHors ligneAdministrateurPoints: 16442 Défis: 140 Message

Citer : Posté le 24/10/2019 16:13 | #


Ben fais-le en deux temps. xD

int nouveau_callback(void volatile *arg)
{
    int x = ancien_callback(arg);
    switch_frames();
    return x;
}

Je peux pas t'aider parce que ça reviendrait à modifier gint pour avoir deux callbacks par timer et les appeler l'un après l'autre. C'est déjà difficile à défendre et en plus les gestionnaires d'interruptions sont trop petits : il n'y a pas la place.
Shadow15510Hors ligneAdministrateurPoints: 4005 Défis: 16 Message

Citer : Posté le 25/10/2019 17:47 | #


Ya un moyen de quitter un add-in proprement avec la possibilité de revenir dessus tout de suite après (avec la touche [MENU]) ou pas ?
Merci d'avance !
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
BulitoHors ligneMembrePoints: 116 Défis: 3 Message

Citer : Posté le 25/10/2019 17:50 | #


gint est compatible Graph 35+E2 ?
N'hésitez pas à me MP pour des échanges d'indices pour le Puzzle de l'Avent 2019 !
LephenixnoirHors ligneAdministrateurPoints: 16442 Défis: 140 Message

Citer : Posté le 25/10/2019 17:51 | #


Shadow15510 a écrit :
Ya un moyen de quitter un add-in proprement avec la possibilité de revenir dessus tout de suite après (avec la touche [MENU]) ou pas ?
Merci d'avance !

Ça arrive ! Il suffit d'appeler getkey(), et quand je l'aurai codé ça sera automatique.

Bulito a écrit :
gint est compatible Graph 35+E2 ?

Oui !

Sauf pour Bfile.
BulitoHors ligneMembrePoints: 116 Défis: 3 Message

Citer : Posté le 25/10/2019 17:53 | #


Super ! Donc n'importe quel add-in créé à partir de gint est utilisable sur graph 35+E2 (sauf s'il utilise Bfile)
N'hésitez pas à me MP pour des échanges d'indices pour le Puzzle de l'Avent 2019 !
Shadow15510Hors ligneAdministrateurPoints: 4005 Défis: 16 Message

Citer : Posté le 25/10/2019 17:53 | #


Donc je met juste key = getkey().key et si c'est [MENU] pof je me retrouve dans le menu principal ?
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
LephenixnoirHors ligneAdministrateurPoints: 16442 Défis: 140 Message

Citer : Posté le 25/10/2019 19:18 | #


Bulito a écrit :
Super ! Donc n'importe quel add-in créé à partir de gint est utilisable sur graph 35+E2 (sauf s'il utilise Bfile)

Oui ! gint est compatible avec quasiment toutes les calculatrices monochromes supportant les add-ins

Shadow15510 a écrit :
Donc je met juste key = getkey().key et si c'est [MENU] pof je me retrouve dans le menu principal ?

Voilà. Enfin là il se passe rien mais dès que ce sera codé tu pull, tu recompiles et ça le fera.
Shadow15510Hors ligneAdministrateurPoints: 4005 Défis: 16 Message

Citer : Posté le 29/10/2019 15:20 | #


Pour le projet Odyssée, on aurait besoin d'une fonction pseudo-aléatoire pour un effet de particules. Mais Gint ne gère pas l'aléatoire… Du coup est-ce que c'est dans les cartons ?

Merci d'avance !
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
LephenixnoirHors ligneAdministrateurPoints: 16442 Défis: 140 Message

Citer : Posté le 29/10/2019 21:51 | #


Tu peux implémenter ton générateur à la façon qui te plaît. Le problème étant que tous les générateurs aléatoires ont des défauts, c'est pour que ça que je ne peux pas en proposer un fixe sans réfléchir...

Si c'est juste pour animer, un truc trivial comme MINSTD suffira :

static int rand_seed = 1;

void srand(unsigned int seed)
{
    rand_seed = seed;
}

int rand(void)
{
    rand_seed = (rand_seed * 48271) % ((1 << 31) - 1);
    return rand_seed;
}

Pour gint, je ne sais pas trop quoi faire. Un Mersenne Twister serait une bonne idée mais le buffer est très gros. Beaucoup d'autres générateurs ont des défauts à la con (du genre alterner des pairs et des impairs). Pour l'instant je n'ai pas encore de plans.
Shadow15510Hors ligneAdministrateurPoints: 4005 Défis: 16 Message

Citer : Posté le 30/10/2019 10:32 | #


C'est juste pour un effet de particules… Donc ça suffit ! Merci beaucoup !

Par contre j'aime pas trop copier sans comprendre, à quoi sert le double chevron : ((1 << 31) -1)
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
HackcellHors ligneMembrePoints: 1155 Défis: 10 Message

Citer : Posté le 30/10/2019 10:36 | #


Ça sert à décaler les bits qui composent un nombre.

Par exemple 8 s'écrit 1000 en binaire, donc 8>>1 va décaler les bits vers la droite, donnant 0100 soit 4. Et pour << c'est la même chose mais de l'autre sens.
I usually spend meow time cosplaying as a diligent student...
So it can get pretty stressful.
That's exactly why PC is such a happy place for meow to be ⭐
Shadow15510Hors ligneAdministrateurPoints: 4005 Défis: 16 Message

Citer : Posté le 30/10/2019 10:37 | #


Je comprends pas trop… Dans le cas de 1 << 31, les bits du nombres 31 sont décalés d'un rang vers la gauche ?
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
HackcellHors ligneMembrePoints: 1155 Défis: 10 Message

Citer : Posté le 30/10/2019 10:38 | #


Non, les bits du nombre 1 sont décalés 31 fois vers la gauche
I usually spend meow time cosplaying as a diligent student...
So it can get pretty stressful.
That's exactly why PC is such a happy place for meow to be ⭐
Shadow15510Hors ligneAdministrateurPoints: 4005 Défis: 16 Message

Citer : Posté le 30/10/2019 10:39 | #


Ah ok ! Merci !
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Moral
   95%
LephenixnoirHors ligneAdministrateurPoints: 16442 Défis: 140 Message

Citer : Posté le 30/10/2019 10:45 | #


En fait ce générateur renvoie des nombres modulo (2^31 - 1), et (1 << 31) c'est la façon la plus rapide de calculer 2^31
Dark stormHors ligneMembre d'honneurPoints: 10858 Défis: 176 Message

Citer : Posté le 30/10/2019 10:46 | #


Concrètement ((1 << 31) - 1) == 2^31 - 1. Sauf que décaler des bits c'est plus rapide que de faire une puissance
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Pages : Précédente1 ... , 21, 22, 23, 24, 25, 26, 27, 28, 29, 30Suivante

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

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd