Page 1 sur 2

question sur script JMRI

MessagePosté: 30 Nov 2017, 22:34
par Peoli
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...

Re: question sur script JMRI

MessagePosté: 30 Nov 2017, 23:20
par JPGO
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.

Re: question sur script JMRI

MessagePosté: 01 Déc 2017, 09:42
par BURLINGTON
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.

Re: question sur script JMRI

MessagePosté: 01 Déc 2017, 10:29
par JPGO
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++

Re: question sur script JMRI

MessagePosté: 01 Déc 2017, 17:54
par BURLINGTON
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.

Re: question sur script JMRI

MessagePosté: 01 Déc 2017, 18:23
par JPGO
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.

Re: question sur script JMRI

MessagePosté: 01 Déc 2017, 18:44
par Lionel
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"

Re: question sur script JMRI

MessagePosté: 01 Déc 2017, 20:02
par BURLINGTON
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 ;)

Re: question sur script JMRI

MessagePosté: 01 Déc 2017, 22:10
par JPGO
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.

Re: question sur script JMRI

MessagePosté: 01 Déc 2017, 22:47
par BR212
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).