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 » [Teaser] PythonExtra.
Lephenixnoir En ligne Administrateur Points: 22761 Défis: 149 Message

[Teaser] PythonExtra.

Posté le 29/10/2022 09:49

Le week-end dernier aux journées APMEP, 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).

L'état actuel de PythonExtra est :
  • Compile pour Graph 90+E (fx-CG 10/20/50)
  • Très très peu de RAM (pas configuré)
  • 3 fois plus de modules que CASIO
  • Un shell minimal
  • Supporte les import de fichiers depuis la mémoire de stockage
  • Contient un module gint avec une bonne partie de <gint/keyboard.h>

Le plan :
  • Support Graph 35+E II (fx-9860G III)
  • Support Graph 75+E si j'ai le temps (mais pas de promesses)
  • Essentiellement l'appli Python en plus riche, mais sans éditeur de texte
  • ... j'en oublie, demandez

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. J'espère finir d'ici le week-end prochain.

Dépôt Git : https://gitea.planet-casio.com/Lephenixnoir/PythonExtra


Précédente 1, 2, 3, 4
Yannis300307 Hors ligne Membre Points: 66 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 Hors ligne Membre Points: 333 Défis: 0 Message

Citer : Posté le 20/11/2022 15:51 | #


@Lephenixnoir, je vais faire un PR pour casioplot.
Yannis300307 Hors ligne Membre Points: 66 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 Hors ligne Membre Points: 333 Défis: 0 Message

Citer : Posté le 20/11/2022 15:53 | #


Celui de la calculatrice est vieux aussi.
Lephenixnoir En ligne Administrateur Points: 22761 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 Hors ligne Membre Points: 333 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: 22761 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 Hors ligne Membre Points: 333 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: 22761 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 Hors ligne Membre Points: 333 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: 22761 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 Hors ligne Membre Points: 333 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: 22761 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 Hors ligne Membre Points: 333 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: 22761 Défis: 149 Message
Parisse Hors ligne Membre Points: 397 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 Hors ligne Membre Points: 333 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 Hors ligne Membre Points: 333 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: 397 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();
Précédente 1, 2, 3, 4

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 - 2022 | Il y a 78 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