[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 03/02/2024 09:23 | #
Tu peux la trouver dans le lien de téléchargement dans le premier post du fil.
Si ça marche pas, dis nous on buildera une version plus à jour avec tous les trucs en statut de développement (et y'a du lourd )
Citer : Posté le 03/02/2024 09:35 | #
Normalemenr le bug "donnée est protégée" est corrigé.
Assurez-vous que vous avez bien la dernière version de PythonExra.
Dans le shell vous devriez y lire cette information : "2024-01-07".
Le_masque comme Slyvtt l'a dis, va tout en haut de la page et clique sur: PythonExtra-pe-0.2.0-beta.zip .
Citer : Posté le 03/02/2024 09:55 | #
Avant de mette en place la nouvelle version je constate quelques bugs que je n'arrive pas à reproduire (je n'ai pas eu vraiment le temps)
La première est que, très rarement, je n'arrivais plus à sortir du menu PythonExtra avec l'indicateur d'activité qui clignote rapidement en grisé.
La seconde est qu'il m'arrive avec des print() de me retrouver avec un affichage de superposition avec le menu.
Je mettrai des photos en éditant ce billet
https://joz.alwaysdata.net/info/
Citer : Posté le 03/02/2024 10:12 | #
Je peux reproduire la superposition d'affichage avec un de mes programmes.
Edit: My bad, c'était la faute du programme... quand on print() il faut mettre à jour l'écran avant de pouvoir continuer à dessiner.
Citer : Posté le 03/02/2024 10:41 | #
Merci beaucoup, je vais pouvoir grandement optimiser mes codes désormais !
Citer : Posté le 03/02/2024 10:42 | # | Fichier joint
Alright, j'ai fini de tester/valider le rendu d'images sur Graph mono. Voilà un exemple final qui démontre plusieurs images, montre qu'on a de la transparence en plus du noir et blanc, qu'on peut afficher des morceaux d'images, et enfin montre que si on crée l'image avec un bytearray on peut ensuite modifier les pixels.
La première image en haut à gauche (le ×) est en 3x3 noir et blanc. Le plus encerclé au milieu a un bord transparent, ce qui se voit à son dessin propre même sur fond noir. L'image des chiffres à 7 segments est affichée une fois en haut et 4 sous-sections sont affichées en bas avec dsubimage() pour obtenir l'affichage "4273". Enfin la moitié supérieure des pixels est modifiée avec une boucle Python et l'image est redessinée, faisant apparaître une inversion noir/blanc.
Le code associé est visible dans l'exemple fx_image.py du dépôt.
Trois remarques importantes.
1. dupdate() après le dernier print() : Après avoir print() les images il faut appeler dupdate() pour signaler qu'on reprend le contrôle du dessin graphique. C'est parce que PythonExtra ne redessine pas l'écran à chaque print() (ce serait bien trop lent quand on affiche beaucoup de texte). À la place, quand on commence à print(), il se note de redessiner toutes les 100 ms. Il faut donc lui dire d'arrêter à un moment quand on veut reprendre le contrôle du dessin graphique. Cette prise de contrôle se fait à l'import de casioplot, de gint, et quand on affiche l'écran (show_screen() ou dupdate()).
2. Génération du code d'images avec fxconv. J'ai ajouté le support de la génération des images Python dans fxconv, l'outil du fxSDK. Je ne suis pas complètement satisfait du fait qu'il faille installer une partie du fxSDK pour y avoir accès, mais c'est un début. Voici comment générer l'image des chiffres 7 segments avec.
seg = gint.image(0, 79, 12, b'|\x00||\x00|||||\x00\x00\xba\x02::\x82\xb8\xb8:\xba\xba\x00\x00\xc6\x06\x06\x06\xc6\xc0\xc0\x06\xc6\xc6\x00\x00\xc6\x06\x06\x06\xc6\xc0\xc0\x06\xc6\xc6\x00\x00\x82\x02\x02\x02\x82\x80\x80\x02\x82\x82\x00\x00\x00\x00|||||\x00||\x00\x00\x82\x02\xb8:::\xba\x02\xba:\x00\x00\xc6\x06\xc0\x06\x06\x06\xc6\x06\xc6\x06\x00\x00\xc6\x06\xc0\x06\x06\x06\xc6\x06\xc6\x06\x00\x00\xc6\x06\xc0\x06\x06\x06\xc6\x06\xc6\x06\x00\x00\xba\x02\xb8:\x02:\xba\x02\xba:\x00\x00|\x00||\x00||\x00||\x00\x00')
3. Code compact. Les bytes sous cette forme sont assez chers en place (ici 525 octets pour le fichier). La plupart des octets peuvent être écrits littéralement dans le fichier avec l'option --py-compact.
Ici le fichier final fait 189 octets au lieu de 525 (!). La différence est qu'il contient plein de caractères non imprimables donc ça peut créer des problèmes avec les éditeurs de texte. Pour contexte, le même mécanisme était utilisé pour la démo Bad Apple.
Le support des images pour Graph 90+E et des polices arrive bientôt.
Citer : Posté le 03/02/2024 10:59 | #
Resalut, enfait, juste j'ai l'impression que le code de la chute tridimensionnelle pour graph90, dans le dossier exemple, car même lorsqu'on est pas sur une plate-forme, le score continue à augmenter, il ne descend jamais
Citer : Posté le 03/02/2024 11:00 | #
Oui c'est buggé xD Je l'ai remarqué y'a quelques temps mais j'ai pas corrigé.
Citer : Posté le 03/02/2024 11:13 | #
Autre nouveauté : j'ai commencé à écrire de la documentation. La documentation sera disponible en français et en anglais. J'y ajouterai bientôt des informations générales sur comment installer/utiliser/développer l'application.
Citer : Posté le 03/02/2024 11:47 | # | Fichier joint
Petite update aussi de mon côté, je travaille depuis quelques temps sur une autre fonctionnalité de PythonExtra, mais exclusive à la Graph 90+E (ou fxCG50) : le support des scripts python issus de la Numworks.
J'ai donc mis en place le support de 3 modules propres à la NW : kandinsky, ion et time. Voici un exemple d'utilisation basique de ces modules :
Module kandinsky :
Le module kandinsky offre le support des primitives graphiques via les routines hautes performance de gint. Toutes les fonctions de ce module sont disponibles :
- color(r,g,b) : Génère la valeur de la couleur r,g,b. Vous pouvez aussi simplement utiliser un tuple pour définir une couleur : (r,g,b).
- get_pixel(x,y) : Renvoie la couleur du pixel aux coordonnées x,y sous forme de tuple (r,g,b).
- set_pixel(x,y,color) : Allume le pixel x,y de la couleur color.
- draw_string(text,x,y,[color1],[color2]) : Affiche le texte text aux coordonnées x,y. Les arguments color1 (couleur du texte) et color2 (couleur de lʼarrière plan du texte) sont optionnels.
- fill_rect(x,y,width,height,color) : Remplit un rectangle de largeur width et de hauteur height avec la couleur color au point de coordonnées x et y.
Le module offre de plus un certain nombre de couleurs explicitement nommées et accessibles par une chaîne de caractères. Les valeurs suivantes sont utilisables en lieu et place des paramètres de couleur des fonctions de kandinsky :
- "red", "r"
- "green", "g"
- "blue", "b"
- "black", "k"
- "white", "w"
- "yellow", "y"
- "pink"
- "magenta"
- "grey", "gray"
- "purple"
- "orange"
- "cyan"
- "brown"
Module ion :
Le module ion donne accès à la fonction keydown(k) qui renvoie True si la touche k placée en argument est appuyée et False sinon.
La "conversion" des touches entre la machine NumWorks et Casio fxCG50 se fait selon un mapping détaillé dans la documentation (à l'état de PR pour le moment)
Module time :
Le module time donne accès à deux fonctions :
- monotonic() : Renvoie la valeur de lʼhorloge au moment où la fonction est appelée.
- sleep(t) : Suspend lʼexécution pendant t secondes.
Je vous joins la version Beta avec support de ces modules. Le fichier ZIP joint contient :
- la version PythonExtra avec support des modules NW (attention, le support des images de Lephe n'est pas mergé dans cette version)
- quelques exemples d'utilisation des modules
- la documentation des modules au format MarkDown.
Si vous voulez tester et faire remonter les bugs éventuels ce sera super cool.
N'ayant pas de NW, hésitez pas à me dire si vous voyez des glitches entre ces 2 machines pour un même script ainsi que d'éventuelles fonctions qu'il faudrait supporter en plus (par exemple module random, cmath, ...)
Citer : Posté le 03/02/2024 11:58 | #
Salut tout le monde
Je voulais savoir si c'était possible de savoir toute les couleurs existantes avec gint. Je connais que ça: C_RED C_BLUE C_BLACK C_WHITE
J'ai essayé avec C_YELLOW mais il y avait une erreur .
PS: j'utilise le fxSDK mais je le demande ici car il y a aussi le module gint
Citer : Posté le 03/02/2024 12:02 | #
C_RED, C_GREEN, C_BLUE : rouge, vert, bleu (sur fxCG seulement)
C_WHITE, C_BLACK, C_LIGHT, C_DARK : blanc, noir, gris clair et gris foncé (sur fxCG et fx9860G)
et C_NONE (invisible) (sur fxCG et fx9860G)
et c'est tout. Tu peux en faire d'autres toi même avec C_RGB()
Citer : Posté le 03/02/2024 12:04 | #
merci et les paramètres de C_RGB() c'est le niveau de couleur du rouge, vert et bleu je suppose. Avec un max de 255.
Et C_LIGHT ET C_BLACK permettent de faire des jeux a 4 couleurs pour mono si j'ai bien compris?
Merci
Tuper
EDIT: je n'ai pas de NW donc je ne peux pas tester la version NW de PE .
Citer : Posté le 03/02/2024 12:06 | #
C_RGB() prend des paramètres entre 0 et 31. Cette fonction est pas top en Python cela dit parce que c'est "lent" si tu calcules des couleurs à répétition. Il faudra que je trouve un moyen de rendre tout ça plus rapide.
Et oui C_LIGHT et C_DARK c'est pour les niveaux de gris. Le moteur de gris n'est pas encore disponible dans PythonExtra mais ça va venir.
Citer : Posté le 03/02/2024 12:08 | #
C_RGB() prend des paramètres entre 0 et 31. Cette fonction est pas top en Python cela dit parce que c'est "lent" si tu calcules des couleurs à répétition. Il faudra que je trouve un moyen de rendre tout ça plus rapide.
Et oui C_LIGHT et C_DARK c'est pour les niveaux de gris. Le moteur de gris n'est pas encore disponible dans PythonExtra mais ça va venir.
Tuper
Citer : Posté le 03/02/2024 13:45 | #
Juste, je demande la parce que je ne vois où je pourrais, mais, si j'aimais quelqu'un aurait des contacts au vivrait dans la banlieue de Paris, je recherche un stage, je suis en seconde, dans le domaine de l'informatique, mon language favori est python, mais j'ai des bases en Basic, en java_script, en Linux et en html et css
J'ai un CV et une lettre de motivation qui sont prêt.
Cordialement
Citer : Posté le 03/02/2024 15:23 | # | Fichier joint
Suite à mon post de ce matin et à défaut d'ordi je mets les pseudos bugs en pj. Désolé pour cette méthode
https://joz.alwaysdata.net/info/
Citer : Posté le 03/02/2024 15:55 | #
Petite update aussi de mon côté, je travaille depuis quelques temps sur une autre fonctionnalité de PythonExtra, mais exclusive à la Graph 90+E (ou fxCG50) : le super des scripts python issus de la Numworks.
J'ai donc mis en place le support de 3 modules propres à la NW : kandinsky, ion et time. Voici un exemple d'utilisation basique de ces modules :
Wow ! On va bientôt pouvoir lancer PaintWorks sur une graph 90+e
Citer : Posté le 03/02/2024 16:07 | # | Fichier joint
Merci pour les rapports Ptitjoz. Je vais garder un oeil sur le crash si je le croise. Pour le dessin concurrent as-tu confirmé s'il y a bien un dupdate() ou équivalent entre le dernier print() et le début du dessin du frame graphique ?
Ah et le module Numworks va être fantastique en effet. Merci Sly ! Je regarde pour fusionner la PR dès que j'en aurai fini avec les images et la doc, aujourd'hui avec un peu de chance.
D'ailleurs puisque j'en parle je viens de pousser le support des images sur Graph 90+E ! Voilà un petit teaser ainsi que son code source sur le dépôt.
Tous les formats d'image de gint sont supportés (16-bit, indexé 8 bits, indexé 4 bits). Les pixels de la petite image 3x3 sont utilisés 2 fois, une fois pour créer une image au format P8_RGB565 (i.e. sans transparence), une fois au format P8_RGB565A (avec transparence), c'est pour ça que sur la gauche les coins sont noirs et sur la droite ils sont transparents.
La roue de couleurs est générée automatiquement par une conversion HSL → RGB dans une image au format RGB565A (16-bit avec transparence), c'est cool par contre c'est super lent (y'a un atan2() au milieu). xD
L'image du bas est convertie avec fxconv au format P4_RGB565 (y'a pile 16 couleurs dedans), et on peut la voir affichée une fois en totalité, une fois en 4 morceaux avec la fonction dsubimage() déjà mentionnée dans l'exemple fx qui permet d'afficher une partie d'une image. Cette image est aussi sous le format "compact" dans le code dont j'ai parlé tout à l'heure, ce qui réduit la taille du .py associé d'environ 4500 à 1150 octets.
Contrairement à la version fx le constructeur gint.image() est un peu lourd (y'a plein de paramètres) donc des constructeurs dédiés à chaque format sont fournis pour cacher un peu la complexité de la chose. J'en parlerai dans la doc dès que j'aurai pris le temps de taper tout ça.
Désolé il n'y a pas encore de g1a/g3a, je prends un peu de recul juste avant la prochaine release.
Citer : Posté le 03/02/2024 16:26 | #
Salut, c’est encore moi, après différents tests, je viens de me rendre compte que avec get_keys , la détection des touches est étrange, il faut que j’appuie 2 fois sur une touche pour que ce soit bien elle qui soit détectée, la 1ere fois, c’est toujours l’ancienne touche. Est-ce normal ?
Citer : Posté le 03/02/2024 16:27 | #
Nope. Fais voir ton code ?