[Bêta] PythonExtra.
Posté le 29/10/2022 09:49
PythonExtra est un add-in Python alternatif pour (à ce stade) Graph 35+E II, Prizm et Graph 90+E. L'objectif est de fournir plus de fonctionnalités : modules standard,
getkey(), fonctions de dessin plus performantes, etc.
Version Bêta 0.2
Graph 35+E II / Prizm / Graph 90+E : PythonExtra-pe-0.2.0-beta.zip
Aperçu de PythonExtra sur Graph 90+E. (Cliquez pour agrandir)
Description sommaire des fonctionnalités :
- Compile pour Graph 90+E (fx-CG 10/20/50) et Graph 35+E II (fx-9860G III)
- Peu de RAM sur Graph 35+E II (c'est difficile d'en trouver sur ce modèle)
- Un shell pas trop mal (saisie rapide, scrolling) avec de bonnes performances
- Plein de modules standard
- array, builtins, cmath, collections, io, math, random, struct, sys, time
- Le module spécifique CASIO : casioplot (fidèle à part sur les polices)
- Un nouveau module gint avec les fonctionnalités avancées de gint :
- Pour l'instant, une bonne partie de <gint/display.h> et <gint/keyboard.h>
- Donc getkey() (attente de touche) ainsi que keydown() (test instantané) !
- Et des fonctions de dessin rapides comme dline() ou drect()
Le plan actuel :
- Être sensiblement compatible avec l'appli Python officielle.
- Pousser les fonctionnalités ajoutées pour vraiment relever le niveau de Python !
- Si du temps de développement se débloque : support autres Graph mono (pas de promesses).
Updates et screenshots à venir. Je n'ai pas l'intention d'implémenter un million de fonctionnalités, juste ce qu'il faut pour s'assurer que ça ne finisse pas mal documenté et non maintenu comme CasioPython.
Dépôt Git :
https://gitea.planet-casio.com/Lephenixnoir/PythonExtra
PythonExtra est notamment possible grâce à l'aide précieuse de
Mb88.
Comparaison directe
Dans l'exemple ci-dessous (
réalisé par Mb88), un Flappy Bird déjà bien optimisé (dessin partiel etc, à gauche) est accéléré un bon gros coup en utilisant PythonExtra et le module
gint pour le dessin (à droite).
Contexte historique
Aux
journées APMEP 2022, redgl0w racontait comment le port MicroPython pour Numworks n'était finalement pas super difficile. Moi je parlais de comment un port maison résoudrait le problème de
getkey(), et Critor m'a convaincu d'essayer sur-le-champ.
En fin de compte, j'ai clôné MicroPython Dimanche à midi et à 1 heure du matin j'avais un port fonctionnel avec
getkey() sur ma Graph 90+E (que j'ai d'ailleurs montré à CASIO Lundi, pour la démo). Comme quoi, des fois ça marche tout seul !
(Enfin, le début marche tout seul. Faire une bonne UI et gérer tous les détails ensuite c'est une autre paire de manches !)
Fichier joint
Citer : Posté le 20/11/2022 15:48 | #
Je travail beaucoup avec le serial en ce moment donc je pense serial, je mange serial(es), je dort serial et je me dit que la vie serait moins dur si je pouvais coder avec serial dans python ...
Citer : Posté le 20/11/2022 15:51 | #
@Lephenixnoir, je vais faire un PR pour casioplot.
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 20/11/2022 15:51 | #
Je viens de me rappeler que enumerate() n'est pas implémenté dans le python de base de la calculatrice. (C'est un détail mais bon ...)
Citer : Posté le 20/11/2022 15:53 | #
Celui de la calculatrice est vieux aussi.
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 20/11/2022 16:02 | #
Je travail beaucoup avec le serial en ce moment donc je pense serial, je mange serial(es), je dort serial et je me dit que la vie serait moins dur si je pouvais coder avec serial dans python ...
D'abord il faudrait le faire marcher proprement dans gint. SlyVTT est dessus en ce moment. Si on arrive à finaliser l'API côté gint on pourra ensuite l'exposer côté Python.
@Lephenixnoir, je vais faire un PR pour casioplot.
Merci beaucoup ! Je ne savais même pas que les couleurs étaient optionnelles.
Citer : Posté le 20/11/2022 16:04 | #
Est ce que ce serait possible d'augmenter encore un peu la ram sur G35+eII ?
Et où est ce que l'ouverture des fichiers est gérée ?
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 20/11/2022 16:07 | #
Sur la Graph 35+E II il n'y a pas beaucoup de RAM. Je n'ai pas été tout chercher ; il faut se baser sur la zone que Parisse a récupéré du Python officiel.
L'ouverture des fichiers sur Graph 35+E II et Graph 90+E est codée par le POSIX_READER dans MicroPython et la branche posix-open contient le code de test. Ça ne marche pas encore parce qu'il manque quelques fonctions dans la libc.
Citer : Posté le 20/11/2022 16:08 | #
Je veux dire celle qui ouvre les modules.
Et il faut plus de ram pour faire marcher la chute tridimensionnelle.
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 20/11/2022 16:10 | #
Oups, je me suis trompé dans mon message précédent. La branche posix-open s'occupe de open(). Tandis que le POSIX_READER c'est autre chose, c'est le chargement des modules justement.
J'ai juste activé POSIX_READER dans les options de MicroPython et du coup il va lire les modules avec l'API POSIX de gestion des fichiers, qui est supportée (dans sa majorité) par gint sur Graph 35+E II et Graph 90+E.
Citer : Posté le 20/11/2022 16:11 | #
Et y a t'il une liste des fichiers ouverts quelque part ? Je veux ajouter gint_set_quit_handler().
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 20/11/2022 16:18 | #
Ça, je ne sais pas. Voici une piste : les modules sont ouverts dans lexer.c:mp_lexer_new_from_file() ce qui te ramène dans reader.c:mp_reader_new_file(). C'est lui qui fait le open(2). Le close(2) est fait par la fonction interne mp_reader_posix_close() dont l'adresse est stockée dans la structure reader à la fin de mp_reader_new_file(). Cette fonction est appelée dans lexer.c:mp_lexer_free() via la structure mp_lexer_t. Donc à mon avis tu veux localiser tous ces lexers et les fermer.
La question c'est est-ce qu'il y en a une liste quelque part.
Citer : Posté le 20/11/2022 16:34 | #
Pour la RAM, j'ai trouvé ça dans main.c de micropy.tgz/fxcg de Parisse :
size_t addr=0x8c200000;
addr+=2*1024*1024+256*1024;
printf("mp_init %d : %p\n", 256*1024, addr);
gc_init(addr,addr+256*1024-1);
Est ce que c'est ça ?
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 20/11/2022 16:35 | #
Nope ça c'est pour la Graph 90+E. Mais c'est dans la même veine, cherche un autre gc_init() ou un gc_add() éventuellement.
Citer : Posté le 20/11/2022 17:10 | #
Je ne sais pas comment il a fait ! J'arrive pas à trouver quelque chose pour la 35
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 20/11/2022 17:23 | #
Ça doit être quelque chose dans ce style : https://www.planet-casio.com/Fr/forums/topic15269-10-khicas-add-in-calcul-formel-pour-graph-90e-et-35eii.html#189284
Citer : Posté le 21/11/2022 13:15 | #
La RAM est initialisée dans main.cc de python35.tgz, dans la fonction main1 (on doit pouvoir descendre un peu ram_start, je n'ai pas testé)
kmalloc_init();
/* Ajouter une arène sur la RAM inutilisée */
static_ram.name = "_uram";
static_ram.is_default = 1; // 0 for system malloc first
static_ram.start = (void *) 0x88053800; // tab24+6144
static_ram.end = (void *) 0x8807f000;
kmalloc_init_arena(&static_ram, true);
kmalloc_add_arena(&static_ram);
puis appel à
int python_init(int stack_size,int heap_size){
python_free();
// python_heap=micropy_init(8192,16384);
dConsolePut(("Heap "+print_INT_(heap_size/1024)+"K MicroPython 1.12").c_str()\
);
Console_NewLine(LINE_TYPE_OUTPUT,1);
python_heap=micropy_init(stack_size,heap_size);
//confirm("heap","init");
if (!python_heap)
return 0;
return 1;
}
Citer : Posté le 21/11/2022 17:11 | #
Ok ! merci !
Ps : faudrait que quelqu'un ajoute ça quelque part dans la bible.
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 21/11/2022 18:27 | #
J'ai dû mal comprendre quelque chose :
kmalloc_arena_t python_ram;
python_ram.name = "_uram";
python_ram.is_default = 0;
python_ram.start = (void*)0x88053800;
python_ram.end = (void*)0x8807f000;
kmalloc_init_arena(&python_ram, 1);
bool success = kmalloc_add_arena(&python_ram);
if(!success) {
pe_debug_panic("Can't use Python ram!");
}
/* Get *some* memory from the OS heap */
void *gc_area = malloc(131072);
if(!gc_area)
pe_debug_panic("No heap!");
gc_init(gc_area, gc_area + 131072);
Ps : Est ce que ça va au niveau style ?
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 22/11/2022 16:05 | #
Oui, j'ai répondu un peu vite hier, le code de python_init n'était pas suffisant. Il faut y rajouter la fonction micropy_init qui est chez moi dans la fonction main.c du port de micropython, dans laquelle il y a
(il semble donc qu'il faut enlever un 1 en donnant la derniere adresse memoire incluse dans le tas Python).
Ne pas oublier d'appeler mp_stack_set_limit(stack_size); et mp_init_py();
Citer : Posté le 06/12/2022 22:46 | #
Je suis en train de faire une petite demo PythonExtra :
https://gitea.planet-casio.com/mibi88/plane_3D_demo
mainPE2O.py peut faire ~100 triangles par seconde.
libMicrofx : https://www.planet-casio.com/Fr/forums/topic17259-2-libmicrofx-remplacez-fxlib-pour-faire-des-add-ins-tres-legers.html !
Racer3D : https://www.planet-casio.com/Fr/programmes/programme4444-1-racer3d-mb88-jeux-add-ins.html
Citer : Posté le 12/12/2022 18:33 | #
Hello, sorry for not writing this in French. I can understand it but I'm not so sure about being able to make myself understood...
I've managed to build PythonExtra and while I very much like the way it looks, I have some questions about it:
- Is input() available? I tried a simple program a=input("A: ") and it seems to freeze with a sort of cog icon, both on calc and on Manager
- On Manager I couldn't find a way to type anything in the shell, initially the status icon can change from 1 to S,or to A, and back, but after trying to input any character it sort of freezes. I can go to Menu if I press it twice
PS: feel free to reply in French, if you want
Thank you