question sur script JMRI

Rubrique dédiée aux applications JMRI.

Animateurs: XTof_vl, Rodolphe, Lionel

question sur script JMRI

Messagepar Peoli
30 Nov 2017, 21:34

Bonjour à tous,
Je viens d' écrire un script (+- 3 minutes) pour JMRI qui fonctionne très bien.

J' aimerai que celui-ci redémarre tout seul arrivé à la fin (avec un petit temps d' attente) sans avoir à cliquer de nouveau sur "lancer script", le choisir dans la liste et cliquer sur "ouvrir)

Quelqu' un pourrais t-il me renseigner sur ce que je dois écrire à la fin de mon script pour qu' il redémarre. (je voudrai un genre de script qui tournerai en boucle).

Merci pour votre aide, je vous souhaite une bonne soirée...
Peoli
 
Messages: 1
Enregistré le: 24 Nov 2012, 13:34

Re: question sur script JMRI

Messagepar JPGO
30 Nov 2017, 22:20

Bonsoir,
Je ne connais pas spécialement le scripting de JMRI, mais dans le cas générique, si le langage permets la récursivité, on a une variable "nombre_boucle" avec une valeur et en fin de script, on "réappelle" le script tant que la valeur de "nombre_boucle" n'est pas atteinte. Si atteinte, alors return.
Attendre les réponses des experts JMRI.
JPGO
 
Messages: 346
Enregistré le: 22 Jan 2015, 11:53

Re: question sur script JMRI

Messagepar BURLINGTON
01 Déc 2017, 08:42

Les scripts JMRI sont écrits en langage JYTHON. Clone du PYTHON pour JAVA.
Je ne connais pas ce langage, bien que formé à la logique avec d'autres langage.
Je suis donc intéressé par les réponses à ta question.
Les Arduino utilisent peut être un langage similaire.
PREVOST Alain
Avatar de l’utilisateur
BURLINGTON
Riveteur de laiton
 
Messages: 5662
Âge: 70
Enregistré le: 13 Déc 2007, 21:40
Localisation: Au pays des lentilles AOC

Re: question sur script JMRI

Messagepar JPGO
01 Déc 2017, 09:29

Donc, à priori, ça le fait:
http://math.univ-lyon1.fr/irem/IMG/pdf/recurs.pdf

Les Arduinos ont un patois à eux qui est un mélange de C et C++
JPGO
 
Messages: 346
Enregistré le: 22 Jan 2015, 11:53

Re: question sur script JMRI

Messagepar BURLINGTON
01 Déc 2017, 16:54

JYTHON est un clone mais apparemment, il y a quelques écarts. Donc le code est à vérifier.
Ceci dit des boucles du type "répéter - tant que" ou "faire - jusqu'à" sont disponibles dans JYTHON mais je ne connais pas leur syntaxe.
PREVOST Alain
Avatar de l’utilisateur
BURLINGTON
Riveteur de laiton
 
Messages: 5662
Âge: 70
Enregistré le: 13 Déc 2007, 21:40
Localisation: Au pays des lentilles AOC

Re: question sur script JMRI

Messagepar JPGO
01 Déc 2017, 17:23

BURLINGTON a écrit:JYTHON est un clone mais apparemment, il y a quelques écarts. Donc le code est à vérifier.
Ceci dit des boucles du type "répéter - tant que" ou "faire - jusqu'à" sont disponibles dans JYTHON mais je ne connais pas leur syntaxe.

la récursivité n'a rien à voir avec du do until ou do while ou autre. le principe, c'est:
- en entrée de routine on vérifie si nbcycle = "max" : si oui return, sinon on continue
- on fait ce qu'on a à faire
- à la fin : nbcycle = nbcyle + 1
- on "se rappelle".... et ça repart pour un tour

That's all folk.

J'ai cité le lien au dessus pour info, mais en général, les langages interprétés (comme python, perl, rexx ou exec) tolèrent la récursivité. Moins vrai avec les langages compilés.
JPGO
 
Messages: 346
Enregistré le: 22 Jan 2015, 11:53

Re: question sur script JMRI

Messagepar Lionel
01 Déc 2017, 17:44

et hop :

Code: Tout sélectionner
import time

x=0
while True:
   print "Hello world: %d" % (x)
   x = x+1
   time.sleep(1)


!! Attention en Python/Jython, l'indentation (espaces/tabulations) en début de ligne a un sens (ce qui est indenté est dans la boucle, ou dans les conditions).

par ex (le print "j'ai fini" est hors boucle)
Code: Tout sélectionner
import time

x=0
while x<10:
   print "Hello world: %d" % (x)
   x = x+1
   time.sleep(1)
print "J'ai fini"
Lionel
 
Messages: 24
Âge: 48
Enregistré le: 27 Avr 2011, 08:48
Localisation: France - Pau

Re: question sur script JMRI

Messagepar BURLINGTON
01 Déc 2017, 19:02

Merci Lionel.
J'ai récupéré ce code JYTHON sur JMRI
Code: Tout sélectionner
import jarray
import jmri
class Test14(jmri.jmrit.automat.AbstractAutomaton) :
        def handle(self):

            loco=            984
            if loco<128 :
                  long=False
            else :
                  long=True
            self.throttle = self.getThrottle(loco, long)
            self.waitMsec(200)
            self.throttle.setIsForward(True)
            self.waitMsec(200)
           
            self.throttle.setF0(True)
            self.waitMsec(5000)
     
            v=               50
            vitesse=float(v)/100
            self.throttle.setSpeedSetting(vitesse)
            self.waitMsec(39500)

            v=               0
            vitesse=float(v)/100
            self.throttle.setSpeedSetting(vitesse)
            self.waitMsec(5000)

            self.throttle.setIsForward(False)
            self.waitMsec(200)
           
            v=               50
            vitesse=float(v)/100
            self.throttle.setSpeedSetting(vitesse)
            self.waitMsec(39500)

            v=               0
            vitesse=float(v)/100
            self.throttle.setSpeedSetting(vitesse)
            self.waitMsec(5000)

            self.throttle.setF0(False)
           # self.waitMsec(10000)

           #return 1 
Test14().start()

Je l'ai adapter à mon besoin. Néanmoins je n'ai pas réussi à faire ma boucle. Je ne connais pas le langage. Je suis resté au Qbasic :ange2:
Peux tu m'aider à insérer une boucle pour, par exemple, 10 aller retour.
Merci d'avance ;)
PREVOST Alain
Avatar de l’utilisateur
BURLINGTON
Riveteur de laiton
 
Messages: 5662
Âge: 70
Enregistré le: 13 Déc 2007, 21:40
Localisation: Au pays des lentilles AOC

Re: question sur script JMRI

Messagepar JPGO
01 Déc 2017, 21:10

Bonsoir,

Présenté comme ça, c'est vrai que JMRI c'est tentant! :)
Avec Train Controller, tu cliques sur le canton de départ, puis celui d'arrivée, tu cliques pour dire que c'est un trajet de type navette et tu cliques un dernier coup pour indiquer le nombre d'aller/retour.
Du peu que j'en connaît, il en est de même avec ITrain.
C'est moins geek, mais diablement efficace.
JPGO
 
Messages: 346
Enregistré le: 22 Jan 2015, 11:53

Re: question sur script JMRI

Messagepar BR212
01 Déc 2017, 21:47

Bonjour ,Le même mais in french.
Code: Tout sélectionner
import jarray
import jmri

class BackAndForthTimed(jmri.jmrit.automat.AbstractAutomaton) :

   def init(self):
      # init() Est exécute au lancement.
      # Pas de configuration machine.
      print "Inside init(self)"

      # Choix de l'adresse de la loco.Pour un adresse longue passer de"false" à "true".
      self.throttle = self.getThrottle(8, False)  # short address 8

               
      return


   def handle(self):
      # Le régulateur()est appellé de façon récurente jusqu'a ce qu'il revienne false.
      print "Inside handle(self)"

      # Réglage de la loco en avant.
      print "Set Loco Forward"
      self.throttle.setIsForward(True)
      
      # Attente de 2,5secondes pour l'arrêt moteur ensuite régler les crans de vitesse.
      self.waitMsec(2500)                 
      print "Set Speed"
      self.throttle.setSpeedSetting(0.5)

      # Temporisation pour le départ en Avant.Le temps est en milliseconde.
      print "Wait for forward time"
      self.waitMsec(40500)
      
      # Arrêt du moteur.
      print "Set Speed Stop"
      self.throttle.setSpeedSetting(0)

      # Temps d'attente(La loco pourrait encore bougé
                # à cause de la simulation de l'inertie).
      print "wait 4 seconds"
      self.waitMsec(4000)
      
      # Réglage de la vitesse en sens inverse.Le temps est en milliseconde.
      print "Set Loco Reverse"
      self.throttle.setIsForward(False)
      self.waitMsec(2500)                 # wait 1 second for Loconet to catch up
      print "Set Speed"
      self.throttle.setSpeedSetting(0.5)

      # Temporisation pour le départ en arrière.Le temps est en milliseconde.
      print "Wait for reverse time"
      self.waitMsec(41500)
      print "Set Speed Stop"
      self.throttle.setSpeedSetting(0)
      
      # Temps d'attente(La loco pourrait encore bougé
      # à cause de la simulation de l'inertie).Le temps est en milliseconde.
      print "wait 4 seconds"
      self.waitMsec(3000)

      

      # Retour à la première ligne pour fermer la boucle
      print "End of Loop"
      return 1

          

      # Nécessite l'arrêt de JMRI pour stopper(attention:
      # Ne pas le faire,laisse la loco en marche).
BR212
 
Messages: 679
Enregistré le: 30 Juin 2016, 18:36

Suivante

Retourner vers JMRI

Qui est en ligne

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