π
<-
Chat plein-écran
[^]

Outils communautaires de programmation fx-92 SC+

:fxesp32b: :fxesp32n: :fxesp32v:

Re: Interpréteur fx-92 SC+ pour PC

Message non lude ptijoz » 08 Oct 2019, 21:43

Tu peux nous faire un petit topo pour savoir comment installer ton interpréteur ? Merci :)
Un peu poète, un peu geek, un peu écolo
Avatar de l’utilisateur
ptijoz
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 32.6%
 
Messages: 333
Images: 0
Inscription: 17 Oct 2018, 15:38
Localisation: France Loir et Cher
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: a la poursuite du vent et des etoiles.

Re: Interpréteur fx-92 SC+ pour PC

Message non lude critor » 08 Oct 2019, 21:46

Merci beaucoup. :)

Puisque je peux maintenant utiliser la version publique du lexer.py, voici un premier aperçu de l'autre outil que nous avons développé et utilisons pour l'évaluation des url wes.casio.com reçues au concours.

L'url est convertie en une suite d'actions souris et/ou clavier, conformément à ce que supporte l'émulateur :
Image

Voici à la suite le script Python en cours de développement à cette fin.
Peut-être sera-t-il utile aux personnes souhaitant pouvoir recharger rapidement et automatiquement dans l'émulateur un script dont elles disposent sous la forme d'une url wes.casio.com.

Il ne supporte à date que la configuration clavier Azerty de la France.
Il convertit vers le format propriétaire de fichiers macro partiellement RE à cette fin du logiciel Macro Recorder 1.0.71f.
J'aurais volontiers pris un logiciel libre avec format ouvert documenté, mais pour Windows je n'ai pas trouvé.

Code: Tout sélectionner
#!/usr/bin/python3.7


import sys
import getopt

from lexer import UrlLexer, TextLexer, T

#---
# Main program
#---

usage_string = """
usage: {} <in_url> <out_file> <[options...]

Input mode:
Input is a wes.casio.com URL ("https://...F908313200333500")

#""".format(sys.argv[0]).strip()

E_KEYPRESS=1
E_LEFTCLIC=2
E_WAIT    =3

events=[]

K_F1   =112
K_F2   =113
K_F3   =114
K_F4   =115
K_F5   =116
K_F6   =117
K_F7   =118
K_F8   =119
K_F9   =120
K_F10  =121
K_F11  =122
K_F12  =123
K_LEFT = 37
K_RIGHT= 39
K_UP   = 38
K_DOWN = 40
K_0    = 96
K_1    = 97
K_2    = 98
K_3    = 99
K_4    =100
K_5    =101
K_6    =102
K_7    =103
K_8    =104
K_9    =105
K_DEC  =110
K_PLUS =107
K_MINUS=109
K_STAR =106
K_SLASH=111
K_LP   = 53
K_RP   =219
K_EQUAL=187
K_X    = 88
K_Y    = 89
K_ENTER= 13

def usage(exitcode=None):
    print(usage_string, file=sys.stderr)

    if exitcode is not None:
        sys.exit(exitcode)

def i2leb(v,n):
    v=int(v)
    data=bytearray([])
    while(v):
        data.append(v%256)
        v>>=8
        n-=1
    while(n>0):
      data.append(0)
      n-=1
    return data

def a2leb(a,n):
    data=bytearray([])
    for k in a:
        data.extend(i2leb(k,n))
    return data

def s2utf16(s):
    data=bytearray([])
    for k in range(len(s)):
        data.extend(i2leb(ord(s[k]),2))
    return data

s_window="fx-92+ Speciale College Emulator.exe|fx-92+ Spéciale Collège Emulator|#32770"
s_end=i2leb(4*2,4)+s2utf16("$END")
d_delay=100

def addclick(x,y):
    events.append([E_LEFTCLIC,x,y])
    addwait(d_delay)

def addwait(t):
    events.append([E_WAIT,t])

def addkey(k):
    events.append([E_KEYPRESS,k])
    addwait(d_delay)

def addkeys(a):
    for k in a:
      addkey(k)

def lexer2keys(lex):
    addkey(K_F4)
    addclick(30,40)
    addclick(80,65)
    addwait(2000)
    addkeys([K_F3,K_1])
    addkeys([K_9,K_F1,K_DEC])
    addclick(65,475)
    addclick(65,445)
    addkeys([K_9,K_F1,K_DEC])
    addclick(65,475)
    addclick(105,445)
    addkeys([K_9,K_F1,K_DEC])
    addclick(65,475)
    addclick(145,445)
    addkeys([K_9,K_F1,K_DEC])
    addclick(65,475)
    addclick(180,445)
    addkeys([K_9,K_F1,K_DEC])
    addclick(65,475)
    addclick(220,445)
    addkeys([K_9,K_F1,K_DEC])
    addclick(65,475)
    addclick(260,445)
    addkeys([K_9,K_F1,K_DEC])
    addclick(65,475)
    addclick(260,475)
    addkeys([K_F3,K_8])
    addkeys([K_F1,K_F3,K_DOWN,K_4,K_1,K_4])
    stack=[]
    iparam=0
    while not lex.at_end():
        t=lex.lex()
        # script instructions
        if(t.type==T.FORWARD):
            stack.append(t.type)
            iparam=0
            addkeys([K_F5,K_1])
        elif(t.type==T.ROTATE):
            stack.append(t.type)
            iparam=0
            addkeys([K_F5,K_2])
        elif(t.type==T.ORIENT):
            stack.append(t.type)
            iparam=0
            addkeys([K_F5,K_3])
        elif(t.type==T.GOTO):
            stack.append(t.type)
            iparam=0
            addkeys([K_F5,K_4])
        elif(t.type==T.PENDOWN):
            addkeys([K_F5,K_DOWN,K_1])
        elif(t.type==T.PENUP):
            addkeys([K_F5,K_DOWN,K_2])
        elif(t.type==T.SETVAR):
            stack.append(t.type)
            iparam=0
            addkeys([K_F5,K_DOWN,K_3])
        elif(t.type==T.INPUT):
            stack.append(t.type)
            iparam=0
            addkeys([K_F5,K_DOWN,K_4])
        elif(t.type==T.MESSAGE):
            stack.append(t.type)
            iparam=0
            addkeys([K_F5,K_DOWN,K_DOWN,K_1])
        elif(t.type==T.PRINT):
            stack.append(t.type)
            iparam=0
            addkeys([K_F5,K_DOWN,K_DOWN,K_2])
        elif(t.type==T.STYLE):
            stack.append(t.type)
            iparam=0
            addkeys([K_F5,K_DOWN,K_DOWN,K_3])
        elif(t.type==T.WAIT):
            addkeys([K_F5,K_DOWN,K_DOWN,K_4])
        elif(t.type==T.REPEAT):
            stack.append(t.type)
            iparam=0
            addkeys([K_F5,K_UP,K_UP,K_1])
        elif(t.type==T.REPEAT_END):
            stack.append(t.type)
            stack=stack[:-1]
            addkey(K_DOWN)
        elif(t.type==T.WHILE):
            stack.append(t.type)
            iparam=0
            addkeys([K_F5,K_UP,K_UP,K_2])
        elif(t.type==T.WHILE_END):
            stack=stack[:-1]
            (K_DOWN)
        elif(t.type==T.IF):
            stack.append(t.type)
            iparam=0
            addkeys([K_F5,K_UP,K_UP,K_3])
        elif(t.type==T.IF_END):
            stack=stack[:-1]
            addkey(K_DOWN)
        elif(t.type==T.IFELSE):
            stack.append(t.type)
            iparam=0
            addkeys([K_F5,K_UP,K_UP,K_4])
        elif(t.type==T.ELSE):
            addkey(K_DOWN)
        elif(t.type==T.IFELSE_END):
            stack=stack[:-1]
            addkey(K_DOWN)
        # instructions separator bytes
        elif(t.type==T.NOP):
            addkeys([K_F5,K_UP,K_3])
        elif(t.type==T.EOL):
            pass
        elif(t.type==T.END):
            pass
        elif(t.type==T.PARAM):
            tin=stack[len(stack)-1]
            if(tin in [T.REPEAT,T.WHILE,T.IF,T.IFELSE]):
                addkeys([K_ENTER,K_ENTER])
            if(tin in [T.FORWARD,T.ROTATE,T.ORIENT,T.PRINT]):
                addkeys([K_ENTER,K_ENTER])
                stack=stack[:-1]
            if(tin==T.GOTO):
                iparam+=1
                if(iparam==2):
                    addkeys([K_ENTER,K_ENTER])
                    stack=stack[:-1]
                else:
                    addkey(K_ENTER)
            if(tin==T.INPUT):
                addkey(K_ENTER)
                stack=stack[:-1]
            if(tin==T.SETVAR):
                iparam+=1
                if(iparam==2):
                    addkey(K_ENTER)
                    stack=stack[:-1]
                else:
                    addkey(K_ENTER)
        # numeric values
        elif(t.type==T.CONST):
            if(stack[len(stack)-1] in [T.MESSAGE,T.STYLE]):
                addkey(K_1+t.args[0]-1)
            else:
              if(t.args[0]==3.141592653589793):
                addkey(K_F1)
                addclick(160,635)
              else:
                s=""
                for b in t.args[1]:
                  c=chr(b)
                  if c=="-":
                    addkey(K_F1)
                    addclick([65,445])
                    s+="[(-)]"
                  elif c==".":
                    addkey(K_DEC)
                    s+=","
                  else:
                    addkey(K_0+int(c))
                    s+=str(int(c))
        # variables
        elif(t.type==T.VAR):
            if(stack[len(stack)-1]==T.SETVAR and iparam==1 or stack[len(stack)-1]==T.INPUT):
                addkeys([K_RIGHT,K_1+"ABCDEFM".index(t.args[0])])
            else:
                if(t.args[0]=="theta"):
                    addkeys([K_F5,K_UP,K_UP,K_1])
                elif(t.args[0] in "xy"):
                    addkey(t.args[0]=="x" and K_X or K_Y)
                else:
                    addkey(K_F2)
                    k="ABCDEFM".index(t.args[0])
                    addclick([65,105,145,180,220,260,260][k],[445,445,445,445,445,445,475][k])
        # operators
        elif(t.type==T.PLUS):
            addkey(K_PLUS)
        elif(t.type==T.MINUS):
            addkey(K_MINUS)
        elif(t.type==T.STAR):
            addkey(K_STAR)
        elif(t.type==T.SLASH):
            addkey(K_SLASH)
        elif(t.type==T.EXP):
            addclick(260,380)
        # relations
        elif(t.type==T.EQUAL):
            addkey(K_EQUAL)
        elif(t.type==T.REL):
            addkeys([K_F5,K_2+["!=",">","<",">=","<="].index(t.args[0])])
        # separator chars
        elif(t.type==T.LPAR):
            addkey(K_LP)
        elif(t.type==T.RPAR):
            addkey(K_RP)
        elif(t.type==T.SEMI):
            addkeys([K_F1,K_3])
        # functions
        elif(t.type==T.FUN):
            # with only keys
            if(t.args[0]=='Ent'):
                addkeys([K_F1,K_STAR])
            elif(t.args[0]=='EntEx'):
                addkeys([K_F1,K_SLASH])
            elif(t.args[0]=='Rnd'):
                addkeys([K_F1,K_0])
            elif(t.args[0]=='Arond'):
                addkeys([K_F2,K_0])
            elif(t.args[0]=='RanInt'):
                addkeys([K_F2,K_DEC])
            # with mouse click
            elif(t.args[0]=='sqrt'):
                addkey(K_F1)
                addclick(105,380)
            elif(t.args[0]=='cbrt'):
                addkey(K_F1)
                addclick(220,380)
            elif(t.args[0]=='GCD'):
                addkey(K_F1)
                addclick(65,410)
            elif(t.args[0]=='LCM'):
                addkey(K_F1)
                addclick(105,410)
            elif(t.args[0] in ['log10','exp10']):
                if t.args[0]=='exp10':
                    addkey(K_F1)
                addclick(220,410)
            elif(t.args[0] in ['log','exp']):
                if t.args[0]=='exp':
                    addkey(K_F1)
                addclick(260,410)
            elif(t.args[0]=='Abs'):
                addclick(145,445)
            elif(t.args[0] in ['sin','asin']):
                if t.args[0]=='asin':
                    addkey(K_F1)
                addclick(180,445)
            elif(t.args[0] in ['cos','acos']):
                if t.args[0]=='acos':
                    addkey(K_F1)
                addclick(220,445)
            elif(t.args[0] in ['tan','atan']):
                if t.args[0]=='atan':
                    addkey(K_F1)
                addclick(260,445)
            else:
                print(t,"WARNING : UNKNOWN FUNCTION")
        else:
            print(t,"WARNING : UNKNOWN TOKEN")

def main():
    # Read command-line arguments
    try:
        opts, args = getopt.gnu_getopt(sys.argv[1:], "hus",
            ["help"])
        opts = dict(opts)

        if len(sys.argv) == 1 or "-h" in opts or "--help" in opts:
            usage(0)

        if len(args) < 2:
            usage(1)

    except getopt.GetoptError as e:
        print("error:", e, file=sys.stderr)
        print("Try '{} --help' for details.".format(sys.argv[0]), file=sys.stderr)
        sys.exit(1)

    program = args[0]
    file = args[1]

    lex = UrlLexer(program)

    lex.rewind()
    lexer2keys(lex)

    datab=a2leb([0x1E848A,0x0F4275,0x01,0x00,0x00,0x0640,0x0384,0x0640,0x0384,0x3F800000],4)
    datab.extend(i2leb(1+len(events),4))
    datab.extend(a2leb([0x64,0x01010101,0x03340101,0x00,0x01,0x07B1DE00],4))
    datab.extend(a2leb([0x08,0x030078,0x00,0x00,0x0152,0x02CA,0x00,0x01,0x00],4))
    datab.extend(i2leb(2*len(s_window),4))
    datab.extend(s2utf16(s_window))
    datab.extend(i2leb(0x00,4))
    datab.extend(i2leb(2*5,4)+s2utf16("$NEXT"))
    datab.extend(s_end)
    for k in events:
        if(k[0]==E_KEYPRESS):
            datab.extend(a2leb([0x05,0x32,k[1],0xFF,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00],4))
            datab.extend(s_end)
        elif(k[0]==E_WAIT):
            datab.extend(a2leb([0x07,k[1],k[1],0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00],4))
            datab.extend(s_end)
        elif(k[0]==E_LEFTCLIC):
            datab.extend(a2leb([0x03,0x32,0x01,0x01,k[1],k[2],0x00,0x01,0x00,0x00,0x00,0x00],4))
            datab.extend(s_end)
    f=open(file,"wb+")
    f.write(datab)
    f.close()

    return 0

if __name__ == "__main__":
    sys.exit(main())


Le script nécessite juste le lexer de l'interpréteur :
https://gitea.planet-casio.com/Lephenix ... 2/lexer.py
Image
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 41.8%
 
Messages: 41470
Images: 14480
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

Re: Interpréteur fx-92 SC+ pour PC

Message non lude Pavel » 09 Oct 2019, 00:44

J'ai aussi écrit un petit script Python pour programmer l'émulateur fx-92+:

https://gitea.planet-casio.com/Pavel/fx92-programmer

Ce script utilise le package pywin32 pour envoyer des clics de souris à la fenêtre de l'émulateur fx-92+.
Avatar de l’utilisateur
PavelPremium
Niveau 7: EP (Espèce Protégée: geek)
Niveau 7: EP (Espèce Protégée: geek)
Prochain niv.: 83.6%
 
Messages: 107
Inscription: 19 Sep 2018, 10:50
Genre: Homme
Calculatrice(s):
MyCalcs profile

Re: Interpréteur fx-92 SC+ pour PC

Message non lude Lephe » 09 Oct 2019, 06:15

Tu peux nous faire un petit topo pour savoir comment installer ton interpréteur ? Merci :)

Bien sûr. Il n'y a pas besoin d'installer le logiciel, il te faut simplement le script avec une installation de Python et PySDL2. Sous Linux Python est probablement déjà là et PySDL2 s'installe avec pip (pip install --user PySDL2). Sous Windows je présume qu'il faut télécharger Python depuis le site et de nouveau utiliser pip (python.exe -m pip install PySDL2).

Ensuite, pour exécuter un programme, il faut sauvegarder le texte dans un fichier. Si c'est une URL, on passe "-u", sinon on passe "-s".

Code: Tout sélectionner
./fx92.py -u <url file>
./fx92.py -s <script file>

J'ai ajouté plus de détails dans un README qui manquait encore sur le dépôt : https://gitea.planet-casio.com/Lephenix ... nterpreter :)

Puisque je peux maintenant utiliser la version publique du lexer.py, voici un premier aperçu de l'autre outil que nous avons développé et utilisons pour l'évaluation des url wes.casio.com reçues au concours.

Beau travail, plus économe que mon implémentation et au moins aussi efficace, bravo :D

J'ai aussi écrit un petit script Python pour programmer l'émulateur fx-92+:

Tant de gourouteries Windows, merci ! Avec ça on pourra bientôt tout faire sans la moindre difficulté :)
Avatar de l’utilisateur
LephePartenaire
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Prochain niv.: 67.7%
 
Messages: 386
Inscription: 15 Juin 2018, 19:53
Genre: Homme
Calculatrice(s):
MyCalcs profile

Re: Interpréteur fx-92 SC+ pour PC

Message non lude ptijoz » 09 Oct 2019, 07:56

bonjour
merci c'est bien ce que je pensais
viewtopic.php?f=27&t=23021&p=246396#
il y a de problèmes d'indentation quans je fais des copier/coller
Code: Tout sélectionner
python3 ./testpy.py
  File "./testpy.py", line 4
    import sys
    ^
IndentationError: unexpected indent



idem pour lexer.py
python3 ./testpy.py
Code: Tout sélectionner
Traceback (most recent call last):
  File "./testpy.py", line 7, in <module>
    from lexer import UrlLexer, TextLexer, T
  File "/home/joz/Developpement/fx92plus/lexer.py", line 3
    import math
    ^
IndentationError: unexpected indent


pour info je suis sous Linux

si je rétablis les indentations correctement :
/test.py -u mon_url out.txt ce qui à l'air de fontionner
après je vais regarder ce qu'il faut faire de ce out.txt
Un peu poète, un peu geek, un peu écolo
Avatar de l’utilisateur
ptijoz
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 32.6%
 
Messages: 333
Images: 0
Inscription: 17 Oct 2018, 15:38
Localisation: France Loir et Cher
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: a la poursuite du vent et des etoiles.

Re: Interpréteur fx-92 SC+ pour PC

Message non lude Zocipal » 09 Oct 2019, 12:19

Merci de ta réponse,
Mon erreur est :
Code: Tout sélectionner
    if SDL_WasInit(SDL_INIT_VIDEO):
NameError: name 'SDL_WasInit' is not defined
Image
Avatar de l’utilisateur
ZocipalProgrammeur
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Prochain niv.: 60.7%
 
Messages: 113
Inscription: 12 Sep 2019, 20:15
Localisation: Hauts-de-France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: 1ère Maths Physique NSI

Re: Interpréteur fx-92 SC+ pour PC

Message non lude Lephe » 09 Oct 2019, 14:46

il y a de problèmes d'indentation quans je fais des copier/coller

Tu peux télécharger une archive sur la forge Gitea ou clôner le dépôt pour éviter le copier-coller. ;)

NameError: name 'SDL_WasInit' is not defined

Ton module SDL n'est "pas le bon". Est-ce que tu sais comment tu l'as installé ? Est-ce que tu peux l'identifier ?

Celui que l'interpréteur j'utilise est PySDL2. ;)
Avatar de l’utilisateur
LephePartenaire
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Prochain niv.: 67.7%
 
Messages: 386
Inscription: 15 Juin 2018, 19:53
Genre: Homme
Calculatrice(s):
MyCalcs profile

Re: Interpréteur fx-92 SC+ pour PC

Message non lude Extra44 » 09 Oct 2019, 14:57

Pavel a écrit:J'ai aussi écrit un petit script Python pour programmer l'émulateur fx-92+:

https://gitea.planet-casio.com/Pavel/fx92-programmer

Ce script utilise le package pywin32 pour envoyer des clics de souris à la fenêtre de l'émulateur fx-92+.

Super cool le programme !
Bravo , Bien joué !
Cela marche impeccable ... !
Petit bémol : ma fenêtre émulateur était au départ en grande taille (zoomée): le script ne faisait que taper bizarrement, parfois sur 'calc' ... bref cela ne marchait pas ! il m'a fallu réduire la taille de la fenêtre de l'émulateur et la mettre au minimum pour que cela marche impec !
Merci ! ;-)
Avatar de l’utilisateur
Extra44Premium
Niveau 11: LV (Légende Vivante)
Niveau 11: LV (Légende Vivante)
Prochain niv.: 58.4%
 
Messages: 591
Images: 1
Inscription: 20 Jan 2011, 00:00
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: S.I.

Re: Interpréteur fx-92 SC+ pour PC

Message non lude Zocipal » 09 Oct 2019, 15:22

Je n'ai rien installé mais pysdl2 l'était déjà.
Code: Tout sélectionner
Requirement already satisfied: pysdl2
Image
Avatar de l’utilisateur
ZocipalProgrammeur
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Prochain niv.: 60.7%
 
Messages: 113
Inscription: 12 Sep 2019, 20:15
Localisation: Hauts-de-France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: 1ère Maths Physique NSI

Re: Interpréteur fx-92 SC+ pour PC

Message non lude Lephe » 09 Oct 2019, 16:35

Je n'ai rien installé mais pysdl2 l'était déjà.

Il te faudra peut-être le mettre à jour (upgrade) ou le réinstaller. ^^
Avatar de l’utilisateur
LephePartenaire
Niveau 10: GR (Guide de Référence)
Niveau 10: GR (Guide de Référence)
Prochain niv.: 67.7%
 
Messages: 386
Inscription: 15 Juin 2018, 19:53
Genre: Homme
Calculatrice(s):
MyCalcs profile

PrécédenteSuivante

Retourner vers Casio (fx-82/83/85/92/95/115/300/350/500/570/991, Collège)

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 13 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
953 utilisateurs:
>941 invités
>8 membres
>4 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)