Création de votre propre fichier de définition d'un décodeur

Animateurs: XTof_vl, Rodolphe

Création de votre propre fichier de définition d'un décodeur

Messagepar XTof_vl
16 Oct 2009, 09:23

Pour que DecoderPro reconnaisse votre décodeur, il est indispensable qu'un fichier de configuration soit créé.

Je vous propose de vous montrer pas à pas, petit à petit, le cheminement nécessaire pour la création d'un tel fichier XML.

Comme il me faut un exemple, j'ai décidé de me baser sur un des décodeurs les plus complets du marché, mais déjà existant, à savoir l'ESU Loksound 3.5.

Alors en tout premier lieu, l'éditeur:
Le fichier XML est un fichier avec des marqueurs qui est interprété par le programme DecoderPro. il contient seulement du texte. Tout éditeur de texte est bon. Soit vous connaissez un éditeur de texte XML, soit vous utilisez un éditeur comme Notepad.

XML en deux mots:
XML est un langage structuré qui est marque des éléments par des marqueurs (tag)
Exemple:
Code: Tout sélectionner
<texte>
Mon premier petit texte XML
</texte>

Un marqueur peut être vide. Il se note alors:
Code: Tout sélectionner
<texte/>

Un marqueur de début d'élément peut avoir des attributs:
Code: Tout sélectionner
<texte auteur="XTof">
Mon premier petit texte XML
</texte>

La présentation d'un texte XML n'a pas d'importance pour le programme qui va l'interpréter. Par contre, elle en améliore la lisibilité. Donc, plutôt que de faire:
Code: Tout sélectionner
<texte auteur="XTof">Mon premier petit texte XML</texte>

Faites:
Code: Tout sélectionner
<texte auteur="XTof">
   Mon premier petit texte XML
</texte>

Lâ structure d'un fichier XML est bien définie. Les régles d'entête, de marquages et de structure sont précises. Comme le fichier va être contrôlé avant d'être importé, il ne faut pas se tromper! Nous verrons ce la à chaque étape de la création d'un fichier de définition d'un décodeur!

Première partie du fichier: l'entête!
Code: Tout sélectionner
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="../XSLT/decoder.xsl"?>
<!DOCTYPE decoder-config SYSTEM "../DTD/decoder-config.dtd">

<!-- Copyright (C) JMRI 2005 All rights reserved -->
<!-- $Id: ESU_LokSoundXLV3_5.xml,v 1.5 2009/08/30 07:47:17 jacobsen Exp $ -->
<!--                                                                        -->
<!-- JMRI is free software; you can redistribute it and/or modify it under  -->
<!-- the terms of version 2 of the GNU General Public License as published  -->
<!-- by the Free Software Foundation. See the "COPYING" file for a copy     -->
<!-- of this license.                                                       -->
<!--                                                                        -->
<!-- JMRI is distributed in the hope that it will be useful, but WITHOUT    -->
<!-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or  -->
<!-- FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License  -->
<!-- for more details.                                                      -->

Que trouvons-nous dans ce header?
Une première ligne nous idiquant la version d'XML. Indispensable, à ne pas modifier.
Une deuxième ligne précisant le style à utiliser pour la présentation du fichier (pour la lecture par une personne. Inutile pour notre usage. Je la supprimerai du fichier.
Une troisième ligne définit le fichier qui décrit la structure que le fichier XML DOIT respecter. Ce sont des règles! Ligne indispensable s'il en est!
Les lignes suivantes sont des commentaires. Elles n'influencent en rien le fichier XML. Je vais les garder par respect pour l'auteur du fichier.

Notre header est donc maintenant:
Code: Tout sélectionner
<?xml version="1.0"?>
<!DOCTYPE decoder-config SYSTEM "../DTD/decoder-config.dtd">

<!-- Copyright (C) JMRI 2005 All rights reserved -->
<!-- $Id: ESU_LokSoundXLV3_5.xml,v 1.5 2009/08/30 07:47:17 jacobsen Exp $ -->
<!--                                                                        -->
<!-- JMRI is free software; you can redistribute it and/or modify it under  -->
<!-- the terms of version 2 of the GNU General Public License as published  -->
<!-- by the Free Software Foundation. See the "COPYING" file for a copy     -->
<!-- of this license.                                                       -->
<!--                                                                        -->
<!-- JMRI is distributed in the hope that it will be useful, but WITHOUT    -->
<!-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or  -->
<!-- FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License  -->
<!-- for more details.                                                      -->
L'Attila du train Ho
Ondraaglijk
Voyou!


Ferjac (Gil Jourdan alias Guus Slim) et Raversijde 1913
Avatar de l’utilisateur
XTof_vl
Van De Guus
 
Messages: 17844
Âge: 61
Enregistré le: 13 Déc 2007, 20:07
Localisation: Linkebeek, Belgïe!

Re: Création de votre propre fichier de définition d'un décodeur

Messagepar XTof_vl
16 Oct 2009, 09:48

Début du contenu:
Code: Tout sélectionner
<decoder-config>
   <!-- made from the ESU_LokSoundV3_0.file -->
   <!-- ver2 CV213 defined multiple times, fixed to 219,222,225,228,231,234 -->
   <!-- also added CV52,121,122,123,124 -->
   <version author="Bob Jacobsen rgj1927@pacbell.net" version="2" lastUpdated="20060413"/>
   <!-- ver3 added Rule 17 lighting options from 4th ed of manual (dated 8/2005) et additional button assignments  -->
   <!-- Also removed LS XL V3.5 due to due to LS V3.5 now using Aux5 et Aux6 mapping to diesel notch up and down, XL has own file -->
   <!-- Added 21 pin version that has 6 functions - Michael Mosher -->
   <version author="Michael Mosher mjmx@comcast.net" version="3"/>
   <!-- ver4 still more light effects (as found in LokProg S/W, not in the manual) - Michael Mosher -->
   <version author="Michael Mosher mjmx@comcast.net" version="4" lastUpdated="20061204"/>
   <!-- ver5 changed mask for CV's to accept 16 in Sound Slot -->
   <version author="wsthompson@earthlink.net" version="5" lastUpdated="20080324"/>
   <!-- ver6 add function button labels -->
   <version author="Daniel Boudreau daboudreau@hotmail.com" version="6" lastUpdated="20081118"/>
   <!-- ver7 correct CV2,3,4,5,6 max values -->
   <version author="Michael Mosher mjmx@comcast.net" version="7" lastUpdated="20090102"/>



Nous y trouvons:
- Un premier tag nous indiquant que nous commençons le contenu.
Ce premier tag signifie qu'en toute fin du fichier, nous trouverons:
Code: Tout sélectionner
</decoder-config>

- Une série de commentaire entrecoupé d'un tag relatif aux versions du fichier XML, avec les noms et mails des auteurs.
Avantage: On peut interroger - ou remercier - les auteurs, et on connaît les évolutions du fichier, y inclus les raisons des évolutions.
L'Attila du train Ho
Ondraaglijk
Voyou!


Ferjac (Gil Jourdan alias Guus Slim) et Raversijde 1913
Avatar de l’utilisateur
XTof_vl
Van De Guus
 
Messages: 17844
Âge: 61
Enregistré le: 13 Déc 2007, 20:07
Localisation: Linkebeek, Belgïe!

Re: Création de votre propre fichier de définition d'un décodeur

Messagepar XTof_vl
16 Oct 2009, 10:02

Decoder-config
Le tag decoder-config contient trois éléments:
- Version (déjà vu dans le message précédent
- decoder qui va décrire le comportement de tous les CVs
- Pane qui va décrire les différents onglets (tab) de l'écran de configuration du décodeur
Le tag decoder-config contient aussi un attribut (non obligatoire) qui est ShowEmptyPanes. Cet attribut peut contenir les variables "yes", "no" et "default", avec comme valeur par défaut "default". Cet attribut permet de dire à DecoderPro d'afficher ou non les onglets sans variable de configuration.

Ici, il a été omis, mais nous pourrions l'ajouter dans notre version du fichier de configuration:

Code: Tout sélectionner
<decoder-config ShowEmptyPanes="No">
L'Attila du train Ho
Ondraaglijk
Voyou!


Ferjac (Gil Jourdan alias Guus Slim) et Raversijde 1913
Avatar de l’utilisateur
XTof_vl
Van De Guus
 
Messages: 17844
Âge: 61
Enregistré le: 13 Déc 2007, 20:07
Localisation: Linkebeek, Belgïe!

Re: Création de votre propre fichier de définition d'un décodeur

Messagepar POMidi
16 Oct 2009, 13:49

Superbe initiative Christophe. :cool: :cool:
Cela fait un moment que j'avais dans l'idée de questionner Rodolphe là dessus. Tu a répondu à la question. :cool:

Je suppose que l'on peut aussi créer des templates pour la fiche de programmation: en effet choisir "Zimo" fait apparaitre les champs spécifiques ZIMO mais en occulte d'autres. J'aurais aimé récrire un template "Zimo complet" qui fasse une synthèse exhaustive.

Amicalement.

Pierre
Grand commandeur de la banane jaune
Avatar de l’utilisateur
POMidi
Vaporiste De Gare
 
Messages: 5643
Âge: 67
Enregistré le: 14 Déc 2007, 10:52
Localisation: Midi-Pyrénées

Re: Création de votre propre fichier de définition d'un décodeur

Messagepar Rodolphe
16 Oct 2009, 13:54

On peut effectivement créer ou modifier les masques de programmation. Je l'ai fait pour celui - très simple - que je diffuse. Avec une variant juste pour moi qui me permet de régler le module sonore Dietz de mon locotracteur. Ce n'est pas franchement évident au départ mais quand on a compris le fonctionnement ça va. Il faut surtout intégrer que pour que le masque puisse proposer certaines informations il faut aussi que ces informations soient déclarées sur la fiche du décodeur. Ça peut semble évident mais la première fois j'ai pas mal cherché pourquoi mon fichier ne fonctionnait pas normalement...

Afin de ne pas corrompre l'installation par défaut et surtout de ne pas perdre ses modifications lors d'une mise à jour complète de l'application, il est conseillé de sauver les fichiers modifiés dans le dossier des paramètres JMRO personnels et non dans celui des paramètres JMRI généraux. Sous Linux c'est simple, sous win je ne sais plus mais Xtof pourra nous renseigner ;)

Rodolphe
Avatar de l’utilisateur
Rodolphe
Jardinier de salon
 
Messages: 23816
Âge: 51
Enregistré le: 11 Déc 2007, 12:26
Localisation: Auzeville-Tolosane, 31

Re: Création de votre propre fichier de définition d'un décodeur

Messagepar XTof_vl
16 Oct 2009, 15:46

Perso, c'est le genre de fichier que je sauvegarde sous un nom différent, du style "Loksound 3.5 XTof". ESU n'est pas près de le sortir!
L'Attila du train Ho
Ondraaglijk
Voyou!


Ferjac (Gil Jourdan alias Guus Slim) et Raversijde 1913
Avatar de l’utilisateur
XTof_vl
Van De Guus
 
Messages: 17844
Âge: 61
Enregistré le: 13 Déc 2007, 20:07
Localisation: Linkebeek, Belgïe!

Re: Création de votre propre fichier de définition d'un décodeur

Messagepar XTof_vl
16 Oct 2009, 17:02

"Decoder" et son premier sous-élément "Family"
Cet élément décrit le décodeur (comme son nom l'indique. C'est facile XML.
Il est composé de 4 éléments:
- Family: Description du modèle de décodeur ou de sa famille, ainsi que du label des fonctions du décodeur
- Programming: Liste des mode de programmation disponible dans ce décodeur
- Variables: liste et comportement de chaque CV (configuration variable) du décodeur
- Resets: Méthode de mise à zéro (reset) du décodeur
Il n'a pas d'attribut.

Dans l'exemple, nous traitons d'abord de l'élément Family dans lequel nous trouvons:
Code: Tout sélectionner
<decoder>
   <family name="ESU LokSound V3.5 Silent BEMF/Sound decoders" mfg="Electronic Solutions Ulm GmbH" lowVersionID="59" highVersionID="59">
      <model model="LokSound Version 3.5" numOuts="4" numFns="12" maxMotorCurrent="1.1A" extFnsNmraF13="yes">
          <output name="1" label="Front lights" maxcurrent="250mA"/>
          <output name="2" label="Rear lights" maxcurrent="250mA"/>
          <output name="3" label="AUX 1" maxcurrent="250mA"/>
          <output name="4" label="AUX 2" maxcurrent="250mA"/>
          <size length="30" width="15.5" height="6.5" units="mm" />
      </model>
      <model model="LokSound Version 3.5 (21 pin)" numOuts="6" numFns="12" maxMotorCurrent="1.1A" extFnsNmraF13="yes">
          <output name="1" label="Front lights" maxcurrent="250mA"/>
          <output name="2" label="Rear lights" maxcurrent="250mA"/>
          <output name="3" label="AUX 1" maxcurrent="250mA"/>
          <output name="4" label="AUX 2" maxcurrent="250mA"/>
          <output name="5" label="AUX 3" maxcurrent="250mA"/>
          <output name="6" label="AUX 4" maxcurrent="250mA"/>
      </model>
      <functionlabels>
         <functionlabel num="0" lockable="true">Light</functionlabel>
         <functionlabel num="1" lockable="true">Bell</functionlabel>
         <functionlabel num="2" lockable="false">Horn</functionlabel>
         <functionlabel num="3" lockable="false">Coupler</functionlabel>
         <functionlabel num="4" lockable="true">Blower</functionlabel>
         <functionlabel num="5" lockable="false">Rev Up</functionlabel>
         <functionlabel num="6" lockable="false">Rev Dn</functionlabel>
         <functionlabel num="7" lockable="true">Mars</functionlabel>
         <functionlabel num="8" lockable="true">Mute</functionlabel>
         <functionlabel num="9" lockable="true">Squeal</functionlabel>
         <functionlabel num="10" lockable="false">CPC</functionlabel>
         <functionlabel num="11" lockable="true">Shunt</functionlabel>
         <functionlabel num="12" lockable="false">Set Brk</functionlabel>
         <functionlabel num="13" lockable="false">Rel Brk</functionlabel>
         <functionlabel num="14" lockable="false">Slack</functionlabel>
         <functionlabel num="15" lockable="false">Smash</functionlabel>
      </functionlabels>
   </family>


Que trouvons-nous dans Family?
- Il est composé de
-ProductIDAlgorithm,
-model
-functionlabels
- Il a comme attribut:
-name: nom de la famille de décodeur pour identification par l'utilisateur
-mfg: nom du fabricant
-type: type de décodeur pour accessoires ("stationary") ou pour locomotives ("locomotive"), cette dernière valeur étant la valeur par défaut
-comment: commentaire éventuel
-lowversionID: borne inférieure de l'intervalle dans lequel doit se trouver le CV 07 afin d'identifier la famille de décodeur
-highversionID: Borne supérieure du même intervalle.
Nous voyons ici que le nom est mis à "ESU LokSound V3.5 Silent BEMF/Sound decoders", le mfg à "Electronic Solutions Ulm GmbH", type et comment sont absent, low et highversionID sont tous les deux à la valeur 59, ce qui signifie que le CV07 de ces décodeurs doit être égal à 59.

Afin de garder la cohérence de la liste des décodeurs dans DecoderPro, il faut impérativement que mfg soit identiquement le même que dans les autres fichiers XML des définitions de décodeurs de la même marque.

Pour productIDalgorithm, le fichier exemple est absent, et donc non-utilisé. Il permet de définir d'autres manière d'identifier l'un de l'autre décodeurs définis dans le fichier de définition.
Il peut contenir l'un des tags suivants:
- none: élément vide qui indique que le décodeur ne peut être ainsi reconnu, peut être omis
exemple:
Code: Tout sélectionner
<productIDalgorithm>
   </none>
</productIDalgorithm>

- simple: L'identification du décodeur peut être effectuée en lisant un autre CV
exemple:
Code: Tout sélectionner
<productIDalgorithm>
   </simple CV="100">
</productIDalgorithm>

- simpleIndexed: L'identification du décodeur peut être effectuée en écrivant un index dans un CV et en lisant une valeur dans un autre CV
exemple:
Code: Tout sélectionner
<productIDalgorithm>
   <simpleIndexed>
      <indexedProductID use="1" PICV="10" PIval="10" SICV="10" SIval="10" prodIdCV="10" />
   </simpleIndexed>
</productIDalgorithm>

- pairedMethodA: L'identification se fait en lisant deux valeurs dans deux autres CVs
exemple:
Code: Tout sélectionner
<productIDalgorithm>
   </pairedMethodA CV1="100" CV2="101">
</productIDalgorithm>

- indexedPairMethodA: L'identification du décodeur peut-être effectuée en écrivant deux index dans deux CVs et ensuite en lisant deux valeurs dans deux autres CVs
exemple:
Code: Tout sélectionner
<productIDalgorithm>
   <indexedPairMethodA>
      <indexedProductID use="1" PICV="10" PIval="10" SICV="10" SIval="10" prodIdCV="10" />
      <indexedProductID use="2" PICV="10" PIval="10" SICV="10" SIval="10" prodIdCV="10" />
   </indexedPairMethodA>
</productIDalgorithm>

On comprend bien pourquoi ce tag n'est pas utilisé, tellement il est compliqué.

Ensuite, comme tags inclus dans le tag Family, nous avons un ou plusieurs tags "model":
Ce tags permet de décrire différentes sous-versions d'un même décodeur. Dans le cas d'ESU, il s'agit de sous-versions avec prise NEM 8 pins ou prise NEM 21 pins.

Et enfin, dans le tag Family, nous avons un tag "Functionlabels":

"Model" et "Functionlabels" seront décrit dans les prochains messages d'explication!
L'Attila du train Ho
Ondraaglijk
Voyou!


Ferjac (Gil Jourdan alias Guus Slim) et Raversijde 1913
Avatar de l’utilisateur
XTof_vl
Van De Guus
 
Messages: 17844
Âge: 61
Enregistré le: 13 Déc 2007, 20:07
Localisation: Linkebeek, Belgïe!

Re: Création de votre propre fichier de définition d'un décodeur

Messagepar XTof_vl
18 Oct 2009, 17:29

Tag Model
Model est un tag qui décrit les différentes variantes d'un même décodeur. Ce tag possède de nombreux attributs.
Nous entrons dans le détail technique et cela variera pour chaque décodeur!

Code: Tout sélectionner
      <model model="LokSound Version 3.5" numOuts="4" numFns="12" maxMotorCurrent="1.1A" extFnsNmraF13="yes">
          <output name="1" label="Front lights" maxcurrent="250mA"/>
          <output name="2" label="Rear lights" maxcurrent="250mA"/>
          <output name="3" label="AUX 1" maxcurrent="250mA"/>
          <output name="4" label="AUX 2" maxcurrent="250mA"/>
          <size length="30" width="15.5" height="6.5" units="mm" />
      </model>
      <model model="LokSound Version 3.5 (21 pin)" numOuts="6" numFns="12" maxMotorCurrent="1.1A" extFnsNmraF13="yes">
          <output name="1" label="Front lights" maxcurrent="250mA"/>
          <output name="2" label="Rear lights" maxcurrent="250mA"/>
          <output name="3" label="AUX 1" maxcurrent="250mA"/>
          <output name="4" label="AUX 2" maxcurrent="250mA"/>
          <output name="5" label="AUX 3" maxcurrent="250mA"/>
          <output name="6" label="AUX 4" maxcurrent="250mA"/>
      </model>

Nous voyons que le loksound 3.5 a deux variantes, le NEM 8 pins et le NEM 21 pins.
L'élément model peut contenir les tags suivants:
- versionCV
- Output
- Size
et possède la liste des attributs suivants:
- model: Nom de la variante du décodeur
Ici, nous avons pour la première variante: model="LokSound Version 3.5"
- options: liste d'options éparées par des ","
- comment: commentaire éventuel
- numFns: Nombre de fonctions de sortie
- numOuts: Nombre de sortie
Ici, nous avons pour la première variante: numOuts="4" numFns="12". En clair, 4 fils et de F1 à F12 utilisables.
- lowVersionID: Pour identification précise du décodeur, borne basse de l'intervalle du CV07
- highVersionID: Pour identification précise du décodeur, borne haute de l'intervalle du CV07
- productID: Identification de la variante
- maxInputVolts: Tension maximum d'entrée, par défaut les spécifications NMRA sont utilisées
- maxMotorCurrent: Idem intensité moteur
Ici, maxMotorCurrent vaut 1.1A
- maxTotalCurrent: Idem intensité totale
- formFactor: Nom de certaines formes spécifique au constructeur
- nmraWarrant : Certificat de conformité NMRA ("yes" ou "no")
- nmraWarrantStart: Si oui, date de début
- nmraWarrantEnd: Si oui, date de fin
- connector: Type de connecteur (unspecified, NMRAsmall, 9pin, NMRAmedium, NMRAlarge, other)
- extFnsNmraF13: Paquets possibles pour F13 / F20 ("yes" ou "no")
Ici, extFnsNmraF13="yes", donc on peut programmer les touches au delà de F13.
- extFnsNmraBSC: Etat de contrôle binaire ("yes" ou "no")
- extFnsMRC: extension "Model Rectifier Corp" ("yes" ou "no")

Nous verrons ultérieurement les tags versionCV, Output et Size qui composent model.
L'Attila du train Ho
Ondraaglijk
Voyou!


Ferjac (Gil Jourdan alias Guus Slim) et Raversijde 1913
Avatar de l’utilisateur
XTof_vl
Van De Guus
 
Messages: 17844
Âge: 61
Enregistré le: 13 Déc 2007, 20:07
Localisation: Linkebeek, Belgïe!

Re: Création de votre propre fichier de définition d'un décodeur

Messagepar XTof_vl
18 Oct 2009, 19:44

Les trois éléments suivants sont présentés dans le code du message précédent.

versionCV
version CV est un élément vide (= qui n'a pas de contenu), mais qui a des attributs qui une décrivent les identifiants de la variante:
- lowVersionID: borne basse de l'intervalle de valeurs pour le CV 07
- highVersionID: idem, borne supérieure
- Comment: Commentaire éventuel

C'est élément, optionnel, n'est pas repris dans le fichier XML du Loksound 3.5.

Output
Output est également un élément vide, avec les attributs suivants:
- name: nom de la sortie utilisé comme moyen d'identification.
Dans notre cas, ce sont des chiffres qui sont utilisés, de 1 à 4 pour le loksound 8 pins et de 1 à 6 pour le loksound 21 pins.
- label: C'est le label de la sortie.
Dans notre exemple, c'est "Front lights", "Rear lights", "AUX 1" et "AUX 2". Classiquement, les noms des sorties des fils des décodeurs.
- comment: commentaire éventuel
- maxcurrent: C'est un texte libre reprenant le courant maximum
Dans notre exemple, les différentes sorties sont à 250mA
- connection: avec comme valeur possible: plug, solder, wire, other, unspecified
Dans notre cas, cela a été omis, mais devrait prendre les valeur "plug" pour les fils jaune, blanc, bleu et vert et "wire" pour le fil mauve.

Size
Size est à nouveau un élément avec les attributs suivants:
- length: longueur
- width: largeur
- height: épaisseur
- units: unités en "inches", "cm" ou "mm"
- comment: commentaire éventuel
Cet élément est bien présent ici. Comme les valeurs changent d'un décodeur à l'autre, quand vous reprenez un fichier XML d'un décodeur pour créer un fichier XML d'un autre décodeur, il est important que vous modifiez ces valeurs. En effet, certains pourraient se base sur ces chiffres pour choisir l'un ou l'autre décodeur...
L'Attila du train Ho
Ondraaglijk
Voyou!


Ferjac (Gil Jourdan alias Guus Slim) et Raversijde 1913
Avatar de l’utilisateur
XTof_vl
Van De Guus
 
Messages: 17844
Âge: 61
Enregistré le: 13 Déc 2007, 20:07
Localisation: Linkebeek, Belgïe!

Re: Création de votre propre fichier de définition d'un décodeur

Messagepar Bob Jacobsen
19 Oct 2009, 07:31

(I apologize profusely for posting in English. I can understand French enough, but my written French is too bad to subject you to)

I'm one of the JMRI developers. I put the internationalization tools in the JMRI code, and I'm now working on updating JMRI to better handle multiple languages in the decoder definition files. Marc Fournier mentioned this thread in the JMRI users list.

I would very much like to work with you to make it easier to include multiple languages for decoder definitions, and to make it easier to really use JMRI in French. I have a prototype of a way to combine decoder definitions to greatly reduce the amount of replicated text, which will also make it easier to maintain them in multiple languages. I'd like to show it to interested people et discuss whether this is a good approach, or perhaps find an even better one.

My direct email address is rgj1927@pacbell.net, or you can reach me through the various JMRI mailing lists. I look forward to talking to you, and I apologize again for posting in English.

Bob
Bob Jacobsen
 
Messages: 1
Enregistré le: 19 Oct 2009, 07:00

Suivante

Retourner vers SPROG : informations, support

Qui est en ligne

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