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:
- 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.
- 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 ();
- 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.
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.