Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » [Bêta] PythonExtra.
Lephenixnoir En ligne Administrateur Points: 22876 Défis: 149 Message

[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.1
Graph 35+E II : PythonExtra.g1a
Prizm / Graph 90+E : PythonExtra.g3a


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


Yannis300307 Hors ligne Membre Points: 68 Défis: 0 Message

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 ...
Mb88 En ligne Labélisateur Points: 537 Défis: 0 Message
Yannis300307 Hors ligne Membre Points: 68 Défis: 0 Message

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 ...)
Mb88 En ligne Labélisateur Points: 537 Défis: 0 Message
Lephenixnoir En ligne Administrateur Points: 22876 Défis: 149 Message

Citer : Posté le 20/11/2022 16:02 | #


Yannis300307 a écrit :
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.

Mb88 a écrit :
@Lephenixnoir, je vais faire un PR pour casioplot.

Merci beaucoup ! Je ne savais même pas que les couleurs étaient optionnelles.
Mb88 En ligne Labélisateur Points: 537 Défis: 0 Message

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 ?
Lephenixnoir En ligne Administrateur Points: 22876 Défis: 149 Message

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.
Mb88 En ligne Labélisateur Points: 537 Défis: 0 Message

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.
Lephenixnoir En ligne Administrateur Points: 22876 Défis: 149 Message

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.
Mb88 En ligne Labélisateur Points: 537 Défis: 0 Message

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().
Lephenixnoir En ligne Administrateur Points: 22876 Défis: 149 Message

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.
Mb88 En ligne Labélisateur Points: 537 Défis: 0 Message

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 ?
Lephenixnoir En ligne Administrateur Points: 22876 Défis: 149 Message

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.
Mb88 En ligne Labélisateur Points: 537 Défis: 0 Message

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
Lephenixnoir En ligne Administrateur Points: 22876 Défis: 149 Message
Parisse Hors ligne Membre Points: 408 Défis: 0 Message

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;
}
Mb88 En ligne Labélisateur Points: 537 Défis: 0 Message

Citer : Posté le 21/11/2022 17:11 | #


Ok ! merci !

Ps : faudrait que quelqu'un ajoute ça quelque part dans la bible.
Mb88 En ligne Labélisateur Points: 537 Défis: 0 Message

Citer : Posté le 21/11/2022 18:27 | #


J'ai dû mal comprendre quelque chose :
/* Add some Python ram */
    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 ?
Parisse Hors ligne Membre Points: 408 Défis: 0 Message

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
  gc_init(heap, heap + heap_size - 1);

(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();
Mb88 En ligne Labélisateur Points: 537 Défis: 0 Message

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.
Iard Hors ligne Membre Points: 5 Défis: 0 Message

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

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2023 | Il y a 87 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