JMRI Support - LocoNet® Implementation
Author: Bob Jacobsen
Keywords: JMRI LocoNet technical implementation

# Informations sur la mise en oeuvre JMRI LocoNet®

Cette page décrit les diverses structures de haut niveau sur la mise en oeuvre de JMRI LocoNet. S'il vous plaît voir aussi les JavaDocs pour le paquet jmrix.loconet .

## LocoNet Valeurs Spécifiques

La classe LnConstants fournit les statiques, les constantes finales pour représenter divers domaines et les valeurs dans les messages LocoNet. A un certain moment, certaines de celles-ci devraient être intégrées dans des classes spécifiques (c.-à LocoNetMessage) de sorte que le codage et les algorithmes de décodage n'ont pas à apparaître dans de nombreux endroits.

## Envoi et Réception de Messages LocoNet

La Classe LocoNetInterface fournit la connexion basique à LocoNet pour les classes utilisateurs . Les messages sont envoyés en les passant à une prise en charge LocoNetInterface et vous pouvez vous inscrire avec un LocoNetInterface pour être avisé de tout le trafic LocoNet.

La classe LocoNetMessage actuellement (2001) n'aide pas vraiment d'autre code à construire et à décoder les paquets LocoNet, mais les contient juste. Ce devrait être amélioré.

Les étapes pour envoyer un message à LocoNet sont:

1. Créer un LocoNetMessage , et remplissez-le avec le message que vous souhaitez envoyer. Il n'est pas nécessaire de remplir la vérification des bits d'erreur , ce sera fait dans le cadre de l'envoi.
2. Localiser un objet fournissant une interface LocoNetInterface . Dans de nombreux cas, les LnTrafficController devraient fournir cela, et l' objet peut être situé avec

       LocoNetInterface l = LnTrafficController.instance ();

3. Envoyez le message:

       		l.sendLocoNetMessage (msg);

Les classes qui souhaitent recevoir des paquets entrants LocoNet devraient prendre en charge l'interfaces LocoNetListener , et enregistrer leur désir d'écouter via un objet de l'interface LocoNetInterface . Il est important de noter que les objets auditeur ne peuvent pas supposer qu'ils reçoivent des messages entrants LocoNet dans n'importe quel fil spécifique. En particulier, ils ne doivent pas présumer qu'ils recoivent ces messages dans un fil GUI, donc ils ont à transmettre toute modifications de l'interface utilisateur..

## Prise en charge de la Connexion LocoNet

La prise en charge de la communication avec une vraie LocoNet est assurée par des classes qui prennent en charge l'interface LocoNetListener. Il en existe actuellement quatre: LnTrafficController et ses sous-classes LnTrafficPacketizer ,(lien cassé le 17/01/2012) LnTrafficRouter , et LocoNetInterfaceScaffold (lien cassé le 17/01/2012).

### LnTrafficController

La classe abstraite LnTrafficController fournit une prise en charge commune pour ses sous-classes, et ajoute un mécanisme de mise en oeuvre pour trouver une LocoNetInterface utilisable.

La routine addLocoNetListener et les méthodes removeLocoNetListener sont mises en oeuvre ici, avec une méthode de notification pour transmettre LocoNetMessages aux auditeurs.

L'instance statique () est utilisée par un grand nombre de classes jmrix.loconet pour trouver une LocoNetInterface pour transmettre et recevoir des messages. Elle fonctionne grâce à un membre statique "automatique", qui est initialisé avec un LnTrafficController objet sous-classe qui est créé. Tous les objets qui veulent envoyer ou recevoir à travers la LocoNet utiliserons la dernieré création de l'application LnTrafficController. Voir la section sur les " Démarrages " pour plus d'informations à ce sujet.

### LnTrafficPacketizer

La classe LnTrafficPacketizer étend la mise en oeuvre de LnTrafficController pour envoyer et recevoir des paquets sur un lien série LocoBuffer à un LocoNet. Il fonctionne avec une mise en oeuvre de la Classe abstraite LnPortController - , qui travaille au niveau des flux de caractères. Ceux-ci communiquent à travers des flux de Java qui transportent les messages LocoNet comme des séquences de caractères. La mise en oeuvre de LnPortController est disponible pour le LocoBuffer, MS100 et pour la lecture d'un fichier Rapport hexadécimal.

Il utilise des fils séparés pour la transmission et la réception de caractères à partir des flux. L'opération de réception se fait dans un fil de sorte qu'il peut facilement décrocher si aucun message n'est disponible. L'opération d'émission se fait dans un fil pour une raison analogue; parfois l'entrée d'un LocoBuffer s'éteindra (sortie du programme), ce qui provoque le décrochage du flux des opérations d'écriture. En faisant ceci dans un fil séparé, nous pouvons détecter ou au moins contourner ceci sans que la totalité du programme ne s'arrête.

### LnTrafficRouter

La classe LnTrafficRouter fournit une opération de Dispersion-Regroupement pour l'interface LocoNetListener. Notez que cette mise en oeuvre ne transforme pas la LocoNetMessages dans le trafic série.
Notez l'objet de deux LnTrafficRouter. Il fournit une LocoNetInterface pour tous les LocoNet en utilisant des messages dans le noeud distant, de sorte que seuls une copie de chaque message voyage à travers le lien à distance.

Notez que la communication "une classe distante " pourrait également être mise en oeuvre comme une sous-classe de LnTrafficRouter, au lieu de communiquer avec un.

### LocoNetInterfaceScaffold

La classe LocoNetInterfaceScaffold fournit une mise en oeuvre de LnTrafficController pour une utilisation dans les programmes de test. Plutôt que de communiquer avec un LocoNet réel, il fournit un échafaudage pour rendre facile à tester la transmission et la réception de messages.

## Démarrage

Il y a des classes "action" qui se connectent à une source d'entrée. Le principal programme met celle-ci dans un menu, sur un bouton, etc, afin que l'utilisateur puisse sélectionner la connexion souhaitée. L'ensemble actuel (Mars 2002) est:

- LocoBufferAction - crée un objet LocoBufferAdapter et configure pour un fonctionnement avec un LocoBuffer
- MS100Action - crée un objet MS100Adapter et configure pour fonctionner avec une MS100
- LnHexFileAction - crée un objet LnHexFilePort et configure pour un fonctionnement comme "LocoNet Simulator" (auparavant, cela était connu comme "Le fichier Hex LocoNet", comme il peut charger le contenu d'un fichier de chaînes de caractères hexadécimcommaux)

En plus de configurer l'adaptateur pour la source d'entrée, quelque chose à configurer l'ensemble des objets gérant et les objets manipulés par LocoNet. Il s'agit notamment de:

- Typiquement un LnPacketizer, qui devient l' "instance" pour les objets qui utilisent LnTrafficController.instance () pour localiser une interface.
- Un ProgrammerInstance
- Un PowerManagerInstance
- Un TurnoutManagerInstance

Ces trois derniers fournissent des services basés sur LocoNet pour les Interfaces JMRI de niveau supérieur.

Les méthodes de configuration () dans les divers adaptateurs de classes font cela. Ce n'est pas un mécanisme très général. Bien qu'un LnPacketizer soit la bonne chose pour se connecter à chacun des adaptateurs port série, le reste de la configuration peut varier.

## Adaptateurs Port

LnPortController est une classe de base abstraite pour réaliser des mises en oeuvres communes pour l'adaptateur de classes qui se connectent à des ports série avec des protocoles spécifiques.

#### MS100

Notez que l'application courante MS100 n'est pas aussi robuste que nous ayons vraiment besoin qu'elle soit. En particulier, le délestage et la retransmission ne sont pas cochées. La meilleure solution disponible maintenant est désormais d'utiliser un LocoBuffer au lieu d'un MS100 pour l'accès au LocoNet; qui a un PIC en elle qui gère tout cela correctement.

La classe MS100Action (paquet jmrix.loconet.ms100) démarre une connexion LocoNet via un MS100. Une fois déclenché, il crée un objet MS100Frame visible.

À son tour, le MS100Frame crée un objet MS100Adapter, montre ensuite les ports de communication disponibles , permettant à l'utilisateur d'en choisir un. L'objet MS100Adapter met en oeuvre l'interface LnPortController, de sorte qu'il peut éventuellement connecter un LnTrafficController à un port série et MS100.

Quand le bouton "port ouvert MS100" est enfoncé, l'objet MS100Frame

- Passe du port de communication sélectionné à l'MS100Adapter. L'adaptateur, puis MS100 se connectent à ce port et créent le flux d'entrée et de sortie
- Puis s'assure qu' un objet LnTrafficController existe en appelant le procédé LnTrafficController.instance
- Relie cette instance LnTrafficController à l'MS100Adapter (sous-classe de LnPortController)
- Commence LnTrafficController dans un nouveau fil pour qu'il puisse gérer les messages entrants de façon asynchrone.

#### LocoBuffer

Très semblable au cas MS100, avec la même séquence d'opérations. La configuration du port est quelque peu différente. Les classes sont dans le paquet jmrix.loconet.locobuffer.

#### HexFile

Les classes HexFile (paquet jmrix.loconet.hexfile ) sont destinées à simuler une connexion LocoNet partir d'un fichier de données. La fourniture des types de connections du "Simulateur LocoNet". Un fichier de données de format hexadécimal se nourrit dans les messages comme s'ils provenaient d'une connexion externe.

L'initialisation est fournie par la classe HexFileAction. Une fois déclenchée, elle crée un objet HexFileFrame visible. Cela fournit un bouton, que l'utilisateur peut utiliser pour sélectionner un fichier d'entrée.

Quand un fichier est sélectionné, l'objet HexFileFrame

- Crée un objet HexFileAdapter connecté à ce fichier
- Puis s'assure qu' un objet LnTrafficController existe en appelant le procédé LnTrafficController.instance.
- Relie cette instance LnTrafficController à l'HexFileAdapter (sous-classe de LnPortController)
- Commence LnTrafficController dans un nouveau fil pour qu'il puisse gérer les messages entrants de façon asynchrone.

## Slot et gestion du Programmateur

Les "slots" sont à la base du fonctionnement d'une station de commande LocoNet. Ils sont représentés par la classe LocoNetSlot. Comme LocoNetMessage, cette classe n'a pas (encore) fourni un grand nombre de support pour la création et le décodage des statuts des slots . La classe SlotManager écoute le trafic LocoNet pour garder une idée des mise à jour du contenu des slot des centrales de commande. Il pourrait un jour être nécessaires pour la SlotManager de communiquer activement avec la station de commande pour mise à jour de cette information, mais pour ne pas que la SlotManager écoute seulement pour les slots les commande de changement qui proviennent du LocoNet ou sont transmis par le programme.

L'interface SlotListener devraient être appliquée par toute classe qui veut être notifiée lorsqu'un slots change .

Parce que les stations de commande Digitrax gérent la programmation via un emplacement réservé spéciale , l'interface jmri.Programmer est également implémentée par la classe loconet.SlotManager. Cela complique grandement la classe, mais elle est acceptable pour l'instant.

LocoNet® est une marque séposée de Digitrax, Inc.