Voici ma dernière mouture. ;)
Première chose immédiatement visible : quand on ouvre le fichier, on a un réseau complet, qu’on peut utiliser.
Et comme la fenêtre fait 1366 x 768, même ceux qui ont un Mac ne seront pas gênés par mon menu qui ressemble à leur dock, mais sans être au dessus du vrai dock du Mac.
On peut bien sûr l’utiliser en plein écran ou en plus petit grâce aux loupes :
Si on clique GAUCHE, c’est le pupitre qui change de taille.
Si on clique DROIT, c’est tout le réseau qui change de taille.
On peut aussi déplacer le pupitre par glisser-déposer de la souris sur le signal du pupitre 0 (le premier à gauche).
Une fois qu’on a la configuration qu’on veut, on peut passer à la nouveauté principale :
La gestion des itinéraires.
Dans d’autres logiciels, on doit définir à l’avance les points qui pourront servir de point de départ et de point d’arrivée, généralement dans des grills de gare.
Là, on peut maintenant partir ou arriver de n’importe où, à proximité d'un signal.
Pour le découpage du réseau, l’élément de base est la zone.
Il existe fondamentalement deux types de zones :
Les zones appareils de voies qui ne contiennent que des appareils de voie. Je les nomme zones AV.
Les zones qui ne contiennent aucun appareil de voie. Je les nomme SAV.
Les zones mixtes. Je sais, ça fait 3 types… :D
Je suis sûr qu’à la SNCF on peut trouver des zones qui ne contiennent que des appareils de voie et qui, pourtant, ont aussi des signaux.
Mais j’ai pris pour principe que les zones AV n’auront aucun signal.
De la même façon, il doit exister à la SNCF des zones SAV sans aucun signal (hors zones de manœuvre où c’est, par contre, très courant).
Mais j’ai pris pour principe que les zones SAV auraient deux signaux, un à chaque extrémité.
Dans les zones mixtes, il y aura aussi deux signaux, mais placés sur la partie SAV. Exemple sur le réseau d’essai, en haut à gauche.
Avec ces deux principes, je peux placer automatiquement les signaux sur n’importe quel réseau.
Je suis conscient que ce sont des "limitations", mais qui ne doivent pas être bloquantes.
Le connecteur
Le connecteur est l’élément fondamental pour découvrir les itinéraires. (Merci Jean-Luc pour ce post pionnier sur le Forum Locoduino)
Au niveau structure, c'est le point qui est entre deux "pavés" (sous-ensemble des zones).
En fait, même s'ils existent vraiment "partout", ceux qui nous intéressent sont ceux qui sont juste à côté d'un signal.
Pour choisir un itinéraire, on clique GAUCHE à proximité d'un signal, au départ comme à l'arrivée.
Dans la précédente version, j'avais en plus comme contrainte que le connecteur soit au point de jonction d'une zone AV et d'une zone SAV. C'était très gênant en pleine voie. Cette contrainte n'existe plus.
Attention au fonctionnement du programme qui est très précis sur ce point :
Le programme choisit le connecteur avec signal LE PLUS PROCHE (à vol d'oiseau) du clic de souris.
Dans des zones denses, il faudra bien se rappeler ce point et bien viser. On pourrait avoir des surprises !
Pour bien mémoriser le choix du départ comme de l'arrivée, le signal choisi devient noir le temps qu'on ait choisi l'itinéraire.
On a donc un signal noir au départ et un signal noir à l'arrivée.
Ainsi, si vous avez cliqué à proximité d'un autre signal sans le vouloir, quand le programme vous dira "Aucun itinéraire n'est possible avec ces deux extrémités", vous verrez où est l'erreur…
Si un itinéraire est possible, il s'affiche en couleur "sable" et, dans la barre de statut (sous le menu), vous savez combien il en existe.
En cliquant GAUCHE autant de fois que nécessaire, on fait défiler tous les itinéraires trouvés.
Puis vous validez avec un clic DROIT. L'itinéraire passe au vert.
A noter que si aucun itinéraire ne vous convient, dans la liste des itinéraires, il y en a un qui est "vide". Si vous validez DROIT à ce moment, on oublie tout. Retour à la situation précédente.
Évidemment, les signaux reprennent leur couleur dès qu'on valide. Et d'ailleurs, les signaux suivent la position des aiguilles. Un minimum.
Voici la première vidéo qui illustre les différents choix.
https://www.youtube.com/watch?v=xNL-_q-Ybp8 (https://www.youtube.com/watch?v=xNL-_q-Ybp8)
Les itinéraires chainés
On a choisi un itinéraire. C'est bien. Mais il serait bien de pouvoir les chaîner.
1°) Chaînage "en avant" :
Très utile si on veut parcourir un ovale, par exemple. Il faut, au moins, chaîner deux itinéraires.
On peut, également passer par une boucle de retournement, en deux fois, bien sûr.
Fonctionnement :
Une fois le premier itinéraire choisi, on en choisit un deuxième, un troisième, …
La contrainte est que la dernière zone du premier itinéraire soit aussi la première zone du deuxième. C'est tout.
Voici la vidéo explicative. En faisant des arrêts image vous pourrez voir quels signaux sont noirs d'un itinéraire sur l'autre pour vérifier la technique de choix.
https://www.youtube.com/watch?v=5oIPjexo_XU (https://www.youtube.com/watch?v=5oIPjexo_XU)
Vous noterez aussi qu'à chaque nouvel itinéraire, vous pourrez toujours choisir l'un des itinéraires proposés, comme avant. Donc, vous pouvez vraiment choisir d'aller où vous voulez, par le chemin que vous voulez.
Vraiment tout ? Non !
2°) Chaînage "retour" :
Il y a des situations où vous voudriez bien rebrousser chemin. L'exemple le plus courant est la navette
C'est le même principe que le chaînage en avant. Sauf que vous choisissez le deuxième itinéraire dans l'autre sens.
Là aussi, la dernière zone du premier itinéraire doit être la même que la première zone du deuxième.
Voici la vidéo explicative :
https://www.youtube.com/watch?v=ki3OFXSQxwo (https://www.youtube.com/watch?v=ki3OFXSQxwo)
Le train ralentit et dès que la vitesse est à zéro, il change de sens.
On peut, bien sûr, mixer les deux modes. Et, là, oui, on peut tout faire !
Remarque sur les vidéos :
1°) J'ai fait exprès de rendre immédiate l'accélération. La loco "s'essuie les roues" au démarrage, surtout si vous demandez la vitesse maximale. Cela m'était très utile pour le développement.
Par contre, les ralentissement/arrêts sont, eux, bien naturels.
Voilà un exemple de décélération suivie d'un arrêt :
(http://www.locoduino.org/local/cache-vignettes/L150xH66/deceleration_127-0-c2db1-4e559.png?1533401621)
On a une décélération qui suit bien une courbe de ralenti réaliste. Le fait que cette courbe ressemble à une décharge de condensateur nous aide bien…
2°) Le retournement est, lui aussi, brutal. Il faudra ajouter un temps d'arrêt en gare dans une prochaine version.
3°) Vous avez certainement cherché un bouton d'inversion de sens du train. Il n'y en a pas !!
Une flèche suit l'orientation de la loco (merci Pierre59 pour cette idée sympa), mais c'est tout.
Si vous voulez reculer, il faut demander un itinéraire dans l'autre sens à partir de la zone où vous êtes.
Pour l'instant, ça ne marche que si vous êtes sur une zone de fin d'itinéraire, mais je suis en cours de développement. La difficulté viendra de l'effacement de tout, y compris les chaînages, si on veut reculer de façon inopinée. Mais c'est jouable.
4°) Au fur et à mesure de l'avancement, comme dans un PRS, les zones s'effacent quand le train les quitte. C'est le but.
Il y aura un autre bouton de recherche d'itinéraires sur le menu où, cette fois, les itinéraires seront sauvegardés pour faire une boucle continue ou une navette sans fin. Faisable aussi.
Les itinéraires continueront à s'effacer au fur et à mesure car c'est la solution qui permet le plus de flexibilité, mais ils se "régénèreront" automatiquement.
5°) Vous avez remarqué qu'on peut poser un train sur n'importe quelle zone. C'est bien.
Mais j'ai à gérer la composition du train pour qu'elle puisse évoluer. On a le droit d'ajouter ou de retirer des véhicules à tout moment, voire le train complet.
6°) Puisqu'on peut aller partout, il faut ajouter une gestion de gare cachée.
On peut d'ores et déjà le faire en demandant une voie précise de la gare, mais il faut que je gère la recherche d'une voie libre automatique.
Voici le lien pour télécharger le programme :
http://www.locoduino.org/IMG/zip/train_tco_v1_6_33.zip (http://www.locoduino.org/IMG/zip/train_tco_v1_6_33.zip)
Mais pourquoi avoir fait un réseau aussi moche ? ;D
(http://www.locoduino.org/IMG/png/circuit_d_essai_avec_zones.png)
Je suis bien d'accord qu'il n'est pas beau, c'est le moins que l'on puisse dire…
Je l'ai construit pour pouvoir tester tous les cas complexes, en me disant que, si ça marche avec un tel réseau, ça n'en sera que plus facile avec un réseau "normal".
Voyons dans le détail les pièges qu'il recèle. >:(
Z0 :
Une zone courte pour savoir comment gérer un train long qu'on poserait là pour démarrer.
En fait, c'est comme si le train sortait d'un tunnel et on voit apparaître les véhicules au fur et à mesure de l'avancement du train.
Cet effet n'est utilisé que dans ce cas. Après, plus aucun véhicule ne disparaît (heureusement)
Par ailleurs, c'est une zone mixte qui comporte à la fois des AV (Appareils de Voie) et SAV (Sans Appareil de Voie) et que, comme on ne met pas de signal sur un AV, il est placé automatiquement en retrait du (ou des) AV de fin de zone.
Enfin, côté butoir, la cible apparait également en retrait, ce qui n'est pas le cas à la SNCF.
En effet, si on doit mettre un feu côté butoir, ce feu est SUR le butoir.
Une chose à corriger.
Z1 :
Une voie de garage classique.
Vous n'allez pas le croire : quand on part de Z0, c'est la zone qu'on trouve en dernier en recherche d'itinéraires, après 172 itérations !!
Cela est dû au fait que, comme l'aiguille de Z0 est en position tout droit, il faut avoir exploré toutes les autres solutions avant qu'on change la position de l'aiguille dans l'algorithme de recherche et qu'on trouve (enfin !) Z1. Mais cela ne prend que quelques milli secondes.
Z2 :
Zone mixte simple. Pour moi, la première fois que l'itinéraire trouvait un pavé "à l'envers".
On voit aussi, à gauche, une cible à moitié "mangée" par la voie du niveau inférieur.
Très facile à régler en décalant d'1/2 carreau vers la droite le niveau inférieur.
Ce bug pourrait aussi être réglé en dessinant les choses dans un autre ordre (les signaux en dernier), mais l'ordre choisi est celui qui est le plus rapide à dessiner et le temps est ce qu'il y a de plus dur à trouver dans un gestionnaire. J'y reviendrais.
Z3, Z4 :
Rien à dire de particulier.
Z5 :
Une aiguille triple. Plus complexe à gérer, avec une subtilité inhérente à sa construction à partir de formes (l'une des formes est "à l'envers" par rapport aux autres).
L'aiguille aurait pu être liée à la Z4, mais j'ai voulu tester une zone d'aiguille isolée.
Z6 :
J'ai volontairement omis le butoir pour cette voie de garage.
C'est une hérésie pour la SNCF, évidemment.
Mais je voulais que ce type d'erreur dans le dessin du réseau ne génère pas de plantage de l'application.
En fait, j'ai résolu le problème en ce sens qu'on ne peut pas sélectionner cette extrémité libre. On ne peut ainsi pas aller vers cette absence de butoir. La seule solution est donc de retourner dans l'éditeur et de rajouter un butoir.
Z6, Z7, Z8 :
Rien à dire de particulier.
Z9 :
Gestion d'une TJD.
Là, je peux dire que ça n'a pas été facile car il y a, à priori, de nombreux cas à gérer.
Jusqu'à ce que je remarque qu'en fait, on est en présence d'une aiguille simple pour chaque entrée !
De quelque côté qu'on aborde une TJD, on n'a qu'un seul choix : tout droit ou dévié.
En fait, c'est un peu plus complexe, mais l'idée est là.
Le cas d'une TJD qui servirait à faire une boucle de retournement est aussi traité.
Z10, Z11 :
Rien à dire de particulier.
Z12 :
Il fallait bien traiter le cas d'une zone qui soit sur deux niveaux. C'est le cas ici.
Beaucoup plus complexe qu'on pourrait le penser de prime abord.
De plus, c'est une boucle de retournement (voir Z15 à Z20).
Z13 :
La première zone comportant deux aiguilles.
Z14 :
Cette zone, coincée entre deux boucles de retournement, n'a pas posé de problèmes particuliers pour la recherche d'itinéraires, mais plus tard, lors de l'affichage des itinéraires.
Il faut afficher, de la bonne couleur et effacer au bon moment.
Z15 à Z20 :
Là, on attaque un gros morceau. 8)
Dans l'approche la plus basique de recherche d'itinéraires, si on repasse deux fois au même point, on abandonne la branche concernée.
Dans le fil de Jean-Luc (http://forum.locoduino.org/index.php?topic=167.30) de … 2016, il explique bien pourquoi il faut tenir compte du sens de passage quand on fait les recherches.
En particulier pour la boucle de retournement, évidemment.
Donc, si, en continuant la recherche en marche avant, on repasse par le même point, c'est qu'on est passé par une boucle de retournement.
On doit donc reculer dans la recherche pour revenir à ce point et repartir en avant pour parcourir la boucle dans l'autre sens !
C'est absolument indispensable pour pouvoir choisir n'importe quel point (signal) de la boucle.
J'ai compliqué le problème en mettant une voie d'évitement, pour pouvoir vérifier que tous les cas soient traités.
Z21 :
J'ai voulu vérifier qu'on arrivait bien à positionner les signaux sur un simple pavé, qui plus est en courbe. Et ça marche.
Une telle disposition n'aurait aucun sens à la SNCF, bien sûr. C'est un essai.
Accessoirement, je me suis posé la question de savoir si on devait allumer toute la zone Z21 en rouge (= occupation) si on allait, par exemple de Z23 à Z12.
Quand je dis "toute", je veux parler du pavé arc de cercle 45° qui ne fait pas partie du trajet.
Je ne trouve pas ça d'une esthétique folle, mais c'est indispensable à la logique SNCF : Si une zone est occupée, elle est toute entière allumée en rouge.
Z22 et Z23 :
Initialement, je n'avais mis qu'une zone, pour régler un autre problème soulevé par Jean-Luc, toujours dans le même fil.
La question était de ne faire qu'un seul passage dans la recherche d'itinéraires, de ne pas tourner en rond ad vitam aeternam.
Pas de problème, ça, ça marche.
Mais un autre problème, plus sournois, est apparu si on ne fait qu'une seule zone :
Un train dans la boucle et qui voudrait la parcourir (position des aiguilles de Z21 en position tout droit, comme sur le schéma) ne le pourrait pas !!
Si vous regardez bien, les signaux de la boucle seraient tous deux à SEMAPHORE…
Donc, OK pour une boucle ronde, mais avec un minimum de deux zones… et un train plus court que la plus petite des zones (je développerais plus tard cette intéressante question plus générale)
Dernière remarque sur le schéma des zones :
J'avais pensé faire afficher par le programme le nom des zones.
Outre que ça n'est pas si évident que ça à faire, je pense que c'est inutile.
Je ne me sers jamais des noms des zones dans le programme et je viens seulement de réaliser ce dessin, en mettant le nom des zones directement à la main dans l'image.
Dans l'éditeur, j'ai bien besoin de nommer les zones (qui sont des ensembles de pavés), mais il faut juste que deux zones n'aient pas le même nom. C'est tout.
Apparaissent aussi les signaux, ce qui va me permettre de parler de la signalisation.
La signalisation
A la SNCF, on étudie la situation de chaque signal et on définit les conditions d'allumage de chaque feu. C'est forcément la meilleure méthode qui résout la totalité des cas rencontrés, y compris les plus complexes. C'est aussi la seule qui réponde à toutes les situations.
Cette méthode est appliquée par Pierre59 dans son article sur un gestionnaire en C++ http://www.locoduino.org/spip.php?article167
Y est décrit la façon permettant de se rapprocher le plus possible de la solution SNCF et c'est, en plus, un excellent article pour comprendre la programmation objet.
J'y ai appris de nombreuses choses et je programme aussi avec des objets (c'est génial).
Malheureusement, comme, par définition, je ne connais pas le réseau qui va être décrit, il faut que je travaille avec des règles plus générales, ce qui résout toutefois la quasi-totalité des cas rencontrés et, en particulier toutes les situations tordues de mon réseau d'essai.
Vous remarquerez que le schéma du réseau ne mentionne aucun numéro de signal, parce que ça ne me sert pas : c'est le programme qui fait les calculs tous seul.
Supposons que, d'un coup de baguette magique, je connaisse le signal suivant de chaque signal.
J'ai bien dit le suivant (dans les deux sens de circulation), tenant compte de la position des différentes aiguilles du réseau.
Je peux alors appliquer quelques règles simples (dans l'ordre) :
1°) S'il n'y a pas de signal suivant, je mets mon signal au CARRE.
Cela arrive dans le cas des butoirs (ce n'est pas, au sens strict, un CARRE, mais, en tout cas, c'est infranchissable !) et dans le cas des aiguilles prises en talon, lorsque c'est l'autre direction qui est sélectionnée.
2°) Si, pour aller au signal suivant, je rencontre un pavé occupé, je mets SEMAPHORE.
3°) Si le signal suivant est à CARRE ou SEMAPHORE, je mets l'AVERTISSEMENT.
4°) Si, pour aller au signal suivant, je rencontre une aiguille en position déviée limitée à 30 km/h (ou 60 km/h), je mets le signal à RAPPEL DE RALENTISSEMENT (30/60).
5°) Si le signal suivant est à RAPPEL DE RALENTISSEMENT (30/60), je mets RALENTISSEMENT (30/60).
On remarquera un aspect sympa : tout en recherchant le signal suivant, on peut noter, au passage, si on a rencontré un pavé occupé, une aiguille avec ralenti en position déviée. On ne perd pas de temps.
Comment marche la "baguette magique" ?
En fait, cela ressemble à une recherche d'itinéraire, mais en beaucoup, beaucoup plus simple :
1°) On ne va pas loin, on va juste au signal suivant.
2°) On ne change aucune position d'aiguille (surtout pas !) et donc c'est nettement plus rapide.
Quand je vous exposerai ma gestion des itinéraires améliorée, je parlerai du cas des carrés manuels automatiques qui s'ajoute aux cas précédents.
PS : si vous avez à gérer des cas qui ne sont pas décrits dans mon réseau d'essai, n'hésitez pas à m'en faire part pour que je les intègre. Je veux que ça marche partout.