filyb.info

mercredi 28 juin 2006

Casetta et Casetta-GTK

Vous êtes peut-être un utilisateur de calculatrice graphique CASIO (très répandue dans les lycée français), et vous avez eu le malheur de passer sous Linux ?

C'est alors que vous touchez le carcan dans lequel vous enferme les logiciels propriétaires et les formats fermés : le logiciel que vous utilisiez pour transférer des programmes sur votre calculatrice (en France, le logiciel FX-Interface est fourni avec les CASIO 65) n'a pas de version Linux, et le seul utilitaire sous Linux, Cafix, ne gère qu'un format abscons, qui peut certes vous servir de sauvegarde, mais ne vous permet pas de développer vos programmes sous Linux, ou de récupérer des programmes téléchargés sur Internet.

Désormais, vous pourrez faire tout cela sous Linux, en utilisant des logiciels libres ! Je viens de terminer la première version de casetta, un utilitaire en ligne de commande qui permet de réaliser des conversions entre les différents formats de fichier utilisés et qui peut utiliser cafix pour les transférer sur votre calculatrice. Il permet, entre autre, de transférer un fichier FXI comme on en trouve partout sur internet directement sur votre calculatrice !

Et en plus, j'ai programmé une interface graphique, casetta-gtk, qui permet de réaliser ces conversions et éditer vos programmes aussi simplement que vous le faisiez avec des logiciels propriétaires. Un exemple :

Capture d'écran de Casetta-gtk

Vous pouvez trouver plus d'informations sur Casetta sur le site dédié : casetta.tuxfamily.org, notamment la page de téléchargement.

Et pour les utilisateurs d'Ubuntu, Asher256 a bien gentiment accepté de proposer Casetta dans son dépôt. Comme cafix est dans les dépôts universe de Ubuntu, vous pourrez installer casetta sans sortir de votre apt-get !

lundi 26 juin 2006

Étude sur les formats de fichiers pour les calculatrices graphiques Casio

(Note légale : en plus de la licence globale de ce site, ce document et les codes de programmes inclus sont sous la licence GPL.)

Les calculatrices graphiques Casio, à l'instar de celles des autres marques, peuvent transférer certaines de leurs données vers d'autres calculatrices, ou vers un ordinateur, à l'aide de logiciels adéquats. Un problème se pose alors : celui des formats, ouverts ou non, et donc de l'indépendance des utilisateurs vis à vis de ces formats.

Cette étude va présenter les différents formats existants pour stocker des informations provenant d'une calculatrice (des données), dans l'optique suivante : déterminer s'il existe (ou sinon quelles devraient être les caractéristiques) d'un format de fichier ouvert permettant la diffusion de données entre utilisateurs (indépendamment de leurs logiciels/matériels) et l'édition de ces données.

Pour le moment, cette étude se limite aux données de type programmes et backups, qui sont celles dont le besoin de transfert/d'édition est le plus important. Je m'intéresserai peut-être aux autres données dans le futur, et mettrai à jour ce document. Néanmoins, toute contribution sera agréablement acceptée.

Table des matières :

  1. Le format brut
  2. Le format Calculator Text Format
  3. Le format cas
  4. Le format Fa-122/123 (cat)
  5. Le format Fa-124 (g1r)
  6. Le format Fx-Interface (fxi)
  7. Le format cafix
  8. Le format Fx-Interface Backup (fxb)
  9. Le format Fx-Interface Pro Backup (fxm)
  10. Le format Fx-Interface Pro (fxd)
  11. Conclusion : le format newcat

Le format brut

Le format brut ou format raw, est celui utilisé de façon interne par la calculatrice.

Pour les programmes, ce format consiste en un texte dont les caractères de base sont codés en ASCII sur 8 bits, c'est à dire les caractères A à Z, a à z, 0 à 9, espaces , : ( ) . { } [ ] = ' " ~ * / #.

Les sauts de lignes sont codées par un caractère de code 0D (13 - CR), la fin du programme par un caractère FF (255).

Les caractères spéciaux de la calculatrice (racine carrée, Pi, sin, etc) sont représenté par des codes ASCII-like, sur un octet, en utilisant les espaces restants (de 00 à FF, en excluant F7 et 7F (voir plus bas).

Les commandes (accessibles depuis les menus, en fait tout ce qui est inséré comme un caractère, mais qui s'affiche comme un mot - exemples : If , Locate , List ) sont elles codées sur deux octets, le premier commençant par F7 (247) ou 7F (127), et le second pouvant être un caractère entre 00 et FE.

Le format Calculator Text Format (ctf)

Le format CTF est un format ouvert créé pour enregistrer des programmes casio sous forme d'un fichier texte aisément éditable. Ce fichier peut aussi être lu facilement par les humains, afin de faciliter la lecture et le transfert de ceux qui ne possèdent pas de câble pour communiquer avec l'ordinateur. Vous pouvez consulter les spécifications du format CTF, en version pre-1 (Revision A). Ce format est enregistré dans des fichiers ayant l'extension .ctf ou .txt, et est utilisé par le logiciel libre de transfert CaS. Ce format n'est pas capable de différencier les programmes effectuants des calculs sur les bases pour le nouveau basic casio.

Le format cas

Le guide nous apprend ceci sur le format cas :

C'est le format officiel original de casio pour transférer des fichiers depuis votre ordinateur vers votre calculatrice par un câble.

C'est un format binaire qui est illisible par les humains sans un programme idoine

Le programme Casemul (émulateur de calculatrice graphique casio, sous Microsoft Windows - je n'ai pas trouvé de site officiel, une recherche Google vous donnera plusieurs où le télécharger) utilise un format dont l'extension est cas. J'ignore s'il s'agit du même format que celui cité par Roy F. A. Maclean, mais c'est la seule occasion que j'ai eu de travailler avec des fichiers cas.

Je n'ai donc pas étudié en détail ce format.

Le format Fa-122/123 (cat)

Le format cat est celui utilisé par les programmes FA-122 et FA-123, et est lisible par FA-124. Ce format est un format textuel, utilisant uniquement des caractères ASCII, avec des retours à la ligne en CRLF (0D 0A - 10 13).

En partant du format brut, on encode au format cat en convertissant les caractères spéciaux et les commandes avec des équivalences textuelles (par exemple, la commande If, codée en F7 00, devient \If ). Malheureusement, cat ne propose pas un équivalent pour tous les caractères spéciaux, aussi certains restent sous leur forme brute. Pour plus de détails, voici une table d'équivalence format brut/format cat sous forme de trois dictionnaires python, l'un pour les commandes, le second pour les caractères spéciaux, et le troisièmes pour d'autres caractères spéciaux, qui doivent être convertis en derniers (car ils sont présents dans des équivalences précédentes).

Le format cat peut contenir plusieurs données dans le même fichier. Les différentes données sont enregistrées à la suite dans le fichier, sous cette forme :

%Header Record
Format:TXT (1)
Communication SW:0
Data Type:PG (2)
Capacity: (3)
File Name:MyPrgm
Group Name:
Password: (4)
Option1:NL (5)
Option2:
Option3:
Option4:
%Data Record
Le programme, avec les equivalences, comme explique ci dessus
%End
  1. L'existence de cette ligne pourrait indiquer que les données peuvent être enregistrée dans un autre format que le format texte. Ou peut-être est-ce pour les images et autres données qui ne peuvent pas vraiment être enregistrée comme texte ? Je n'ai pas fait plus de recherches à ce sujet.
  2. Le PG veut certainement dire programme. N'ayant pas cherché pour les autres types de données, je ne connais pas leurs identifiants.
  3. Dans les fichiers cat, cette ligne est suivie d'un nombre, probablement la taille du programme en octet. Mais est-ce la taille sur la calculatrice (format brut) ou la taille avec les équivalents textuels ? Je ne me suis pas attardé sur ce point.
  4. D'après certaines lecture, le mot de passe serait ici stocké en clair.
  5. L'option 1 défini si le programme est normal (NL) ou utilise des calculs sur les bases (BN).

Le format Fa-124 (g1r)

Le format g1r est le format du logiciel FA-124, utilisé par les modèles les plus récents de calculatrices casio (celles avec les câbles USB). Les programmes contenus dans ce genre de fichiers sont au format brut et sont entourés d'un bloc fixe de données contenant le nom du programme, et d'autres données dont la taille et le contenu sont très variables. Pour extraire les programmes d'un fichier g1r, on peut utiliser l'expression rationnelle suivante (ici en python avec le module re) :

g1r_file = open(filename, 'r')
# Expression rationnelle :
data_pattern = re.compile('''
    (PROGRAM)      # type de donnée, uniquement programme avec cette expression
    [\x00]{12}     # Séparateur
    [\x01]         # un 0x01 caractère (séparateur)
    system         # La chaîne 'system'
    [\x00]{2}      # Séparateur
    ([^\x00]{1,8}) # nom du programme
    [\x00]{0,7}    # caractères 0x00 qui complètent le nom
    [\x01]         # marqueur de fin du nom
    [\x00]{2}      # Séparateur
    .{2}           # deux caractères
    [\x00]{11}     # Séparateur
    (\x00|\x01)    # Base (0x01) ou non (0x00)
    (.*[^\x00])    # tous les caractères, terminés par un caractère non 0x00 : données brutes
                   #(sans le caractère 0xFF de fin)
    [\x00]{2}      # fin de l'enregistrement
    ''', re.VERBOSE)
    # extraire les données du fichier
    data_list = data_pattern.findall(g1r_file.read())
    g1r_file.close()
    for record in data_list:
        # record = ('DATA TYPE', 'FILE NAME', 'BASE', 'RAW DATA')
        data_type = record[0]
        data_name = record[1]
        if record[2] == '\x01':
            use_base = True
        else:
            use_base = False
        raw_data = record[3] + '\x0d\xff' #ajout des caractères de fin pour les données brutes

Le format Fx-Interface (fxi)

Le format fxi est un format binaire, utilisé par le logiciel Fx-Interface. Ce dernier logiciel est celui vendu en France avec les calculatrices graphiques proposant un câble série pour ordinateur, aussi le format fxi est le format le plus courant sur les sites internet francophones. La lecture de ce format se fait en deux temps (du fait de sa complexité, je ne me suis pas intéressé à son écriture).

Il faut tout d'abord convertir chaque octet du fichier binaire par son équivalent dans le format brut. Un tutoriel d'Alexis Soulard, le format FXI, explique l'algorithme tordu pour construire un tableau d'équivalence (merci milles fois à lui). Le voici en python :

#Build the raw2fxi dic
#Thanks to http://www.casioland.net/tutoriaux.php?idTuto=3&noHeader=1
r2f = {}
dep, a, i, j = 23, 255, 0, 0
v = dep
while a >= 0 :
    v = v + 1
    r2f[a] = v
    a -= 1
    i += 1
    if i == 8 :
        dep -= 8
        j += 1
        i = 0
        v = dep
    if j == 4 :
        j = 0
        dep += 8 * 8
        v = dep

#Build the fxi2raw dic
f2r = {}
for a, f in r2f.items():
    f2r[f] = a

Ensuite, pour convertir le fichier fxi, il suffit d'utiliser la fonction suivante :

def fxiDecode(fxiData):
    """ Convert fxi-like data to raw data """
    out = ''
    for c in range(len(fxiData)) :
        out += chr(f2r[ord(fxiData[c])])
    #Fix the 'or' bug (some 'or' strings was replaced by a 0xAA string ##v0.1.2
    out = out.replace(chr(0xAA),'or')
    return out

Mais comme le format cat, le format fxi peut contenir plusieurs enregistrement de données, ainsi que des informations sur ceux-ci. Et là commence la galère ;-). Voici la structure générale d'un fichier fxi converti à l'aide de l'algorithme précédent (les retours à la ligne n'existent pas, et ne sont qu'une question de présentation, un point d'interrogation représente un caractère non ASCII, une astérisque plusieurs caractères non ASCII ) :

* (L'en tête du fichier : beaucoup de caractères, je ne sait pas trop ce que ça représente)
TXT?PG (probablement l'équivalent des informations du format cat - ici commence l'enregistrement)
????
MyPrgm (le nom du programme)
[16 + 8 - longueur(nom du programme)] * FF (donc entre 24 et 16 caractères 255)
NL (pour un programme normal, BN pour un programme utilisant des calculs sur les bases)
12 * FF
Programme, au format brut
FF (ici se termine l'enregistrement)
* (la séquence dépend ensuite si l'enregistrement est suivi d'un autre ou pas)

La manière la plus simple de récupérer les enregistrements contenus dans un fichier fxi consiste à utiliser une expression rationnelle (ici codé en python avec le module re, utilisant la fonction précédente) :

fxi_file = open(filename, 'r')
# Get the raw data
ctn = fxi_decode(fxi_file.read())
fxi_file.close()
# Make the regular expression
data_pattern = re.compile('''
(TXT)           # data format (but fxi txt is not really text :-/)
.               # separator
(PG)            # type of data
.{4}            # 4 characters
([^\xff]{1,8})  # data name
\xff{16,23}     # between 16 and 23 (16+8-len(data name)) 0xFF
(NL|BN)         # Option1 (Normal or Base)
\xff{12}        # 12 0xFF
([^\xff]+\xff)  # any non 0xFF characters ended by one 0xFF : raw data
''', re.VERBOSE)
# Extract records from raw data using the regular expression
data_list = data_pattern.findall(ctn)
for record in data_list:
    format, data_type, name, optn, data = record
    # Vous pouvez utiliser data_type pour déterminer le type de votre enregistrement,
    # name pour obtenir son nom, optn == "BN" vous indiquera si ce programme utilise des bases,
    # et data contiendra les données brutes du programme.

Le format cafix

Le format cafix est le format des fichiers obtenus avec le logiciel Cafix, un utilitaire en ligne de commande pour transférer des données sous Linux. Le projet semble arrêté depuis quelques années déjà, mais il a le remarquable mérite d'être l'unique outil du genre sous Linux, et de fonctionner (en tout cas avec ma casio 65 et mon câble pour FX-Interface en port COM, ce ne doit pas être le cas avec les nouveaux câbles USB).

Cafix stocke les programmes directement sous leur forme brute, sans stockage de métadonnées ou de possibilité d'enregistrement multiple (ce format ne fait pas de différence entre les programmes normaux et ceux effectuants des calculs sur les bases). Le nom du programme est stocké dans le nom du fichier, de la sorte prog-MyPrgm.cafix. Le fichier peut cependant être renommé sans problème, lors de l'ouverture d'un fichier, Cafix considère que tout le nom du fichier, à l'exclusion de l'extension, est le nom du programme. Aussi MyPrgm devient prog-MyP (à cause de la troncature à 8 caractères). Comportement un peu illogique, mais ça fonctionne et c'est simple.

Pour les backups, cafix utilise le préfixe backup-. Ici aussi, les données sont enregistrées directement sous leur forme brute.

Le format Fx-Interface Backup (fxb)

Le logiciel Fx-Interface stocke les sauvegardes (backups) dans des fichiers différents des autres données (format FXI). Ces fichiers portent l'extension .fxb, et sont composés de la façon suivante (même notation que pour la description des fichiers FXI) :

?*278 (l'en tête 1 du fichier, contenant probablement des informations sur la calculatrice)
10*FF (premier séparateur)
GY358 (en-tête 2, toujours le même avec mes backups de casio 65. Est-ce le modèle de calculatrice ?)
2 * FF
?*6
9*FF (second séparateur)
Données brutes

Vous pouvez voir un exemple d'en-tête (tout ce qu'il y a avant les données brutes) vu sous forme héxadécimale.

Le format Fx-Interface Pro Backup (fxb)

Le logiciel Fx-Interface Pro (à ne pas confondre avec Fx-Interface) possède un format de sauvegarde (backup) différent de la version non-pro. Les données brutes du backup sont stockées dans le fichier sans qu'une quelconque convertion soit nécessaire, mais à l'intérieur d'autres données utilisée par Fx-Interface Pro. Les données brutes sont stockées de l'offset 0000:107A (4218) à l'offset 0001:0879 (67 705), les deux inclus.

Voici un algorithme en python pour extraire les données brutes :

fxm_file = open('backup.fxm','rb')
ctn = fxm_file.read(67706)
fxm_file.close()

bak = ctn[4218:]

raw_file = open('backup.cafix','w')
raw_file.write(bak)
raw_file.close()

Le format Fx-Interface Pro (fxd)

Le logiciel Fx-Interface Pro (à ne pas confondre avec Fx-Interface) possède un format de fichier différent de la version non-pro. Les données brutes sont stockées dans le fichier sans qu'une quelconque convertion soit nécessaire, (contrairement au format fxi), mais à l'intérieur d'une grande quantité (pouvant aller jusqu'à plus de la moitiée du fichier) d'autres données utilisée par Fx-Interface Pro.

Les données brutes (pour l'instant uniquement les programes) peuvent être extraites à l'aide d'une expression rationnelle, en voici un exemple codé en python :

import re

data_pattern = re.compile('''
(PG)            # type of data
.{4}            # 4 characters
([^\xff]{1,8})  # data name
\xff{16,23}     # between 16 and 23 (16+8-len(data name)) 0xFF
(NL|BN)              # Option1 (NL=normal, BN=base)
\xff{13}        # 13 0xFF
.{8}            # 8 characters
([^\xff]+\xff)  # any non 0xFF characters ended by one 0xFF : raw data
''', re.VERBOSE)

fxd_file = open(fxd_filename, 'rb')
out_ctn = data_pattern.findall(fxd_file.read())

# out_ctn contient une liste d'enregistrement de donnée.
# Chaque enregistrement à la structure suivante :
# ("DATA TYPE", "FILE NAME", "OPTION", "RAW DATA")
# DATA TYPE est toujours égal à "PG" (programme) pour l'instant
# FILE NAME est le nom du fichier
# OPTION indique si le programme est normal ou utilise des calculs de base
# RAW DATA est le contenu du programme, sous forme de donnée brute.
# Vous pouvez récupérer ces données à l'aide de ce code :

for record in out_ctn:
    data_type, file_name, option, raw_data = record
    #vous pouvez maintenant exploiter data_type, file_name option et raw_data

Conclusion : le format newcat

À l'aide des diverses méthodes expliquées ci-desus, il est possible de créer un programme permettant de convertir les différents formats entre eux (en utilisant le format brut comme pivot). Autant cela résoud le problème de l'échange de fichier, autant la question des formats ouverts (aucune des spécifications des formats ci-dessus n'est ouverte) et celle d'un format permettant une édition facile reste en suspend.

C'est pourquoi j'ai décidé de créer un format de fichier répondant à ces deux caractéristiques. Fortement inspiré du format cat, j'ai nommé ce format le newcat. Les principales différences sont : une spécification claire (voir plus bas), des retours à la ligne en CR (0D - 13) pour une compatibilité avec les éditeurs de textes unix, et de nouveaux équivalents par rapport au format cat, afin de remplacer tous les caractères spéciaux.

De plus, pour combler les lacunes de Cafix, j'ai créé deux logiciels qui s'appuyent sur ce dernier pour la gestion de la calculatrice, mais qui ajoutent en plus le support (complet ou partiel) des formats fxi, cat, newcat et cafix. Le premier de ces deux logiciels est Casetta, il propose un utilitaire en ligne de commande pour réaliser les opérations décrites, ainsi qu'un module python pour réaliser toutes les convertions. Le second est Casetta-gtk, une interface graphique pour Casetta, qui propos un éditeur de programems.

Historique de ce document

  • 26 juin 2006 : version initiale
  • 1 août 2006 : étude sur les backups pour le format cafix, ajout du format fxb
  • 2 août 2006 : ajout du format fxm
  • 4 août 2006 : ajout du format fxd
  • 6 août 2006 : ajout du format g1r
  • 9, 10 septembre 2006 : ajout des données sur les programmes utilisant des calculs de bases
  • 16 septembre 2006 : ajout d'informations sur le Calculator Text Format
  • 30 septembre 2006 : ajout du support des bases dans l'expression rationnelles du format g1r

mercredi 28 septembre 2005

Mise à jour de programmes pour calculatrices

Quelques petites mise à jour dans mes programmes pour calculatrices CASIO :

  • Correction d'un gros bogue dans les programmes Deg2 et Deg2v2 qui donnait des valeurs fausses aux racines dans certains cas...
  • La découverte d'un bug dans Deg2v2 qui fait planter le programme quand le c du polynôme est égal à 0. Franchement, dans ce cas il suffit de factoriser par x le polynôme, et le programme n'est même pas nécessaire, mais je vais quand même essayer de déboguer la chose... La version 1 n'est pas atteinte par ce problème.
  • Un mise à jour du programme DivL, qui peut désormais afficher la liste des diviseurs d'un nombre entier relatif, qui au lieu de boguer prend la partie entière d'un réel, qui affiche si un nombre est premier, qui donne une réponse pour la liste des diviseurs de 0, etc.

Programmes pour calculatrices CASIO

mercredi 21 septembre 2005

Programmation sur calculatrices

Rentrée oblige, je me suis remis à la programmation sur calculatrices graphiques, dans ce BASIC abâtardit que nous infligent CASIO et TI (quand pourrais-je programme en python sur ma casio ? :-P ). En plus, la programmation sur les calculatrices d'algorithmes simples est au programme de spé. maths... J'ai donc ajouté à la rubrique programmation de ce site une page CASIO, où vous pourrez trouver des programmes inédits, et des dépoussiérages de certains programmes présents sur mon ancien site

Au programme ( ;-) ) :

  • TRIGO 35 : un programme de calculs de trigo dans un triangle rectangles, car je n'arrive à me souvenirs des relations que via de savante réflexions... (petit dépoussiérage d'un programme fait il y a deux ans)
  • Radians : une programme des torturages divers sur les ci-avant-cités mesures d'angles (tout en valeur exactes, ce que la calculatrice est nativement incapable de faire)
  • Degré 2 (version 1 et 2) : programmes fait il y a cinq ou six mois, jamais diffusés auparavant. Résolution d'équations du second degré, la version étant capable d'afficher des valeurs exactes (presque du calcul formel ;-) au prix de beaucoup de dépendances et de mémoire.
  • Dichotomie : programme réalisé hier soir pour la méthode vue hier matin, évite un fastidieux travail (à moins que recopier l'écran de la calculatrice soit considéré comme un fastidieux travail ;-) )
  • DivL : affiche la liste des diviseurs d'un nombre (fait en cours de spé) et amélioré pour avoir un affichage sous forme d'une liste défilante (ascenseur), pratique pour les nombres ayant beaucoup de diviseurs.
  • Euclidienne : donner le quotient et le reste d'une division euclidienne (cours de spé), et améliorer pour gérer la division d'entiers relatifs au lieu d'entiers naturels.

Le tout sous licence GPL, bien sûr. Les fichier sont (hélas) au format fxi, à utiliser avec le logiciel du même nom pour les transférer sur la calculatrice. Et je rappelle à tout ceux qui lisent ce blog et qui me croisent in real life, qu'ils peuvent me demander ces programmes, je me ferai une joie de les leurs copier !

Liste des programmes pour casio.