Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - Jean-Luc

Pages: 1 ... 74 75 [76] 77 78 ... 95
1126
Shields et Modules / Re : Carte Servomoteurs DCC + CAN
« le: mars 14, 2016, 08:35:43 am »
Bonjour,

Inventaire fait, voici ce que j'ai en stock, il s'agit des composants marqués en vert et des supports marqués en jaune.


1127
Shields et Modules / Re : Booster DCC
« le: mars 12, 2016, 12:24:23 pm »
Ça c'est sûr. La loco se met en travers et fait un court jus, le temps que ça coupe tu as fondu les essieux (voire autre chose). Tu as intérêt a avoir une confiance inébranlable dans le logiciel qui mesure le courant et coupe en cas de problème :)

1128
Shields et Modules / Re : Carte Servomoteurs DCC + CAN
« le: mars 12, 2016, 11:56:34 am »
J'en ai monté une. Il manque juste les deux résistances litigieuses du DCC sur le 6N137.

Le nano fonctionne :-)

Je fais un inventaire des composants ce week end mais à vue de nez je peux fournir les résistances, les diodes, certains connecteurs, certains supports de CI et certaines capas. Il faudra se procurer par ailleurs le nano, les deux connecteurs pour le monter, les connecteurs et supports manquant et les CI.

1129
Tu vois, calculer tous les itinéraires, ça n'est pas si long.
Et pourtant, il y en a plein.

Je n'aurais pas dit plein. Ça reste très raisonnable.

Citer
1°) Je passe sur le :
static Voie **sVoies;
Je comprends (enfin, je crois), mais ça se complique.
Un pointeur de pointeur…

Oui, je maintiens une table de pointeurs, des Voie* où chaque objet Voie, ou dérivé de Voie vient inscrire son pointeur  à l'index de son identifiant. De cette manière, je peux retrouver un objet Voie par son identifiant. Comme je ne sais pas à priori combien d'éléments de voie je vais avoir. Je pars sur 256 et une fois que j'ai tout, je retaille le tableau au nombre d'élément effectif.


Citer
2°) je ne comprends pas pourquoi tu dois avoir un creeCheminVers (…) et un tousLesCheminsVers(…) dans chaque classe.
Quand on hérite, on n'hérite pas de tout ?

J'ai laissé creeCheminVers et ajouté tousLesCheminsVers à côté mais à terme, creeCheminVers disparaîtra car tousLesCheminsVers fait mieux.

Citer
3°) Là, je décroche :
static const byte taille() {
      return ((sNombre >> 3) + ((sNombre & 7) != 0));

Je comprends (grosso-modo) la syntaxe, mais pourquoi tu fais ça ?

Ok. Comme je l'ai dit, je gère un vecteur de bits. Là je calcule la taille en nombre d'octets du tableau nécessaire au stockage de ce vecteur. sNombre est le nombre de bits nécessaires, sNombre >> 3 correspond à une division par 8 (2^3 = 8)et donc au nombre d'octets. Mais c'est une division entière. Si sNombre n'est pas divisible par 8 j'ai un reste et j'ai besoin d'un octet de plus. sNombre & 7 est le reste de la division. Si il est différent de 0, je dois avoir un octet de plus et c'est çe que je calcule puisque le != 0 me renvoie 1 si il y a un reste et 0 sinon.

Citer
4°) Et ailleurs, encore mieux (mais je ne comprends plus la syntaxe) :
void EnsembleDeVoies::ajouteVoie(byte identifiant)
{
  mEnsemble[identifiant >> 3] |= 1 << (identifiant & 7);
}

Pareil. Je veux mettre à 1 le bit de rang identifiant. Je divise identifiant par 8 pour avoir l'octet puis sur cet octet je fais un ou avec un 1 décalé du reste.


Citer
void EnsembleDeVoies::enleveVoie(byte identifiant)
{
  mEnsemble[identifiant >> 3] &= ~(1 << (identifiant & 7));
}

bool EnsembleDeVoies::contientVoie(byte identifiant)
{
  return (mEnsemble[identifiant >> 3] & 1 << (identifiant & 7)) != 0;
}

Et là auss, je mets le bit a 0 et je le teste.


Citer
5°) Tu as marqué un commentaire, c'est vrai, mais pour comprendre, là, c'est costaud :
  /* Si sVoies n'est pas alloue, alloue arbitrairement 256 emplacements */
  if (sVoies == NULL) {
    sVoies = (Voie **)malloc(sTailleTableau * sizeof(Voie **));
  }

malloc alloue une zone mémoire comptée en nombre d'octets. Ici je veux allouer sTailleTableau pointeurs. Un pointeur a une taille de sizeof(Voie **) octets. Je caste le resultat qui est un void * en Voie **

Citer

Et, la plus drôle pour la fin : le loop() est ... vide !

Tout est fait dans setup :-)

1130
Questions :

  • Est-ce ces itinéraires tiennent compte des positions des aiguilles ?
  • Sinon, pour en parcourir un faut-il positionner les aiguilles avant le départ du train ?
  • Quid des autres itinéraires pendant les mouvements des trains ?

Dans l'ordre :

  • Non, les itinéraires ne tiennent pas compte de la position des aiguilles. En fait il s'agit ici du problème inverse de celui que tu exposes plus haut. Il s'agit, à partir d'un couple d'emplacements (A,B) sur le réseau, de déterminer les itinéraires possibles et donc la position des aiguilles à appliquer.
  • Oui
  • Ce n'est pas traité pour l'instant mais c'est facilement faisable.

1131
Je viens de pousser de nouvelles choses sur le repository :

1 - Le programme calcule tous les itinéraires de la gare de DDEFF, il y en a 241 (x2 si on compte le même en sens inverse).
2 - Il y 18 couples source, destination qui n'ont pas d'itinéraire possible.
3 - Le programme mesure le temps de calcul de tous les itinéraires : 77ms sachant qu'il y a du code de comptage la dedans (si si je pensais que ça ferait plus, je suis épaté par les perfs du Due).

L'affichage des dits itinéraires est commenté. Pour les afficher, il faut décommenter les lignes 288 à 293 de GestionnaireReseau.ino

1132
Présentez vous ! / Re : De la touraine
« le: mars 11, 2016, 04:34:43 pm »
Bonjour Alain et bienvenue parmi nous  :)

1133
J'ai avancé hier soir.

J'ai ajouté la méthode tousLesCheminsVers aux voies. Il s'utilise comme creeCheminVers mais prend un argument supplémentaire : un ensemble d'itinéraires. Au retour cet ensemble contient tous les itinéraires possible pour aller de A à B.

Un itinéraire est un ensemble de voies (du point de vue ensembliste, c'est à dire qu'il n'y a pas d'ordre). Côté implémentation, un Itinéraire est un vecteur de bits implémenté sous la forme d'un tableau de N octets ou N est le nombre de voies / 8 + 1 quand la division ne tombe pas juste. Quand le bit de rang identifiant de la voie est à 1, la voie est présente dans l'itinéraire et absente sinon. Cela permet une représentation compacte d'une part et des opérations efficaces. Par exemple, des itinéraires sont compatibles si l'intersection des ensembles de voies qui les représente est vide. Il suffit de faire un & pour le savoir.

J'ai donc l'objet Itineraire et EnsembleItineraires.

Exemple:

  EnsembleItineraires iti3;
  voieLibre6.tousLesCheminsVers(VOIE_GARAGE_4, DIRECTION_AVANT, iti3);
  iti3.print();

crée un ensemble d'itinéraires iti3 qui est pour l'instant vide puis le remplit et enfin l'affiche. Il n'y a qu'un seul itinéraire possible entre voieLibre6 et voieGarage4. L'affichage est :

VOIE_LIBRE_6 VOIE_10 VOIE_20 VOIE_31 VOIE_GARAGE_4 AIGUILLE_3 AIGUILLE_4 AIGUILLE_11 TJD_3 TJD_7 TJD_11 TJD_15 CROISEMENT_0 CROISEMENT_2

  EnsembleItineraires iti4;
  voieLibre0.tousLesCheminsVers(VOIE_GARAGE_7, DIRECTION_AVANT, iti4);
  iti4.print();

produit :

VOIE_LIBRE_0 VOIE_0 VOIE_3 VOIE_21 VOIE_29 VOIE_GARAGE_7 AIGUILLE_0 TJD_0 TJD_8 TJD_12 TJD_14 TJD_16 CROISEMENT_2
VOIE_LIBRE_0 VOIE_0 VOIE_2 VOIE_6 VOIE_12 VOIE_26 VOIE_29 VOIE_GARAGE_7 AIGUILLE_0 TJD_0 TJD_1 TJD_2 TJD_11 TJD_14 TJD_16
VOIE_LIBRE_0 VOIE_0 VOIE_2 VOIE_6 VOIE_11 VOIE_18 VOIE_25 VOIE_28 VOIE_GARAGE_7 AIGUILLE_0 AIGUILLE_8 TJD_0 TJD_1 TJD_2 TJD_4 TJD_6 TJD_10 TJD_16 CROISEMENT_0
VOIE_LIBRE_0 VOIE_0 VOIE_2 VOIE_6 VOIE_11 VOIE_16 VOIE_19 VOIE_28 VOIE_GARAGE_7 AIGUILLE_0 AIGUILLE_8 TJD_0 TJD_1 TJD_2 TJD_4 TJD_7 TJD_16
VOIE_LIBRE_0 VOIE_0 VOIE_2 VOIE_6 VOIE_11 VOIE_16 VOIE_20 VOIE_26 VOIE_29 VOIE_GARAGE_7 AIGUILLE_0 TJD_0 TJD_1 TJD_2 TJD_4 TJD_7 TJD_11 TJD_14 TJD_16
VOIE_LIBRE_0 VOIE_0 VOIE_2 VOIE_8 VOIE_29 VOIE_GARAGE_7 AIGUILLE_0 TJD_0 TJD_1 TJD_12 TJD_14 TJD_16 CROISEMENT_2
VOIE_LIBRE_0 VOIE_1 VOIE_21 VOIE_29 VOIE_GARAGE_7 AIGUILLE_0 TJD_8 TJD_12 TJD_14 TJD_16 CROISEMENT_2

7 itinéraires possibles

et enfin :

  EnsembleItineraires iti5;
  voieLibre1.tousLesCheminsVers(VOIE_GARAGE_2, DIRECTION_AVANT, iti5);
  iti5.print();

produit :

VOIE_LIBRE_1 VOIE_2 VOIE_8 VOIE_27 VOIE_32 VOIE_GARAGE_2 AIGUILLE_12 TJD_0 TJD_1 TJD_12 TJD_15
VOIE_LIBRE_1 VOIE_2 VOIE_6 VOIE_11 VOIE_16 VOIE_20 VOIE_32 VOIE_GARAGE_2 AIGUILLE_12 TJD_0 TJD_1 TJD_2 TJD_4 TJD_7 TJD_11 TJD_15 CROISEMENT_2
VOIE_LIBRE_1 VOIE_2 VOIE_6 VOIE_12 VOIE_32 VOIE_GARAGE_2 AIGUILLE_12 TJD_0 TJD_1 TJD_2 TJD_11 TJD_15 CROISEMENT_2
VOIE_LIBRE_1 VOIE_3 VOIE_21 VOIE_27 VOIE_32 VOIE_GARAGE_2 AIGUILLE_12 TJD_0 TJD_8 TJD_12 TJD_15
VOIE_LIBRE_1 VOIE_3 VOIE_22 VOIE_GARAGE_2 AIGUILLE_12 TJD_0 TJD_8

5 itinéraires possibles

J'ai laissé la trace de recherche dans le programme pour voir le cheminement.

Ça ne tourne plus sur le Uno par manque de SRAM (le tas vient télescoper la pile)

J'ai mis le code sur le dépôt git : https://git.framasoft.org/locoduino.org/GestionnaireReseau/tree/master

Téléchargement direct : https://git.framasoft.org/locoduino.org/GestionnaireReseau/repository/archive.zip?ref=master

Vous pouvez vous amuser avec.

La suite : étant donné N ensembles d'itinéraires former si possible des itinéraires compatibles.

1134
Oui mais moi je ne veux pas faire cette phase d'analyse à la main. En fait je ne veux pas faire d'analyse du tout.

1) c'est fastidieux
2) tu peux te tromper (c'est même une garantie si c'est gros)

Comment sais tu que tu as trouvé tous les itinéraires de ton réseau ? 432 est faux il y en a plus car tu as plusieurs chemins intermédiaires entre les doubles diagonales. Par exemple, entre VoieLibre0 et VoieGarage7, tu as 5 itinéraires si mon compte est bon.

108 est également faux car tu ne peux pas aller de VoieLibre0 à VoieLibre9 sans changer de sens.

Enfin il n'y a pas que les extrémités qui nous intéressent. Il faut également construire les itinéraires permettant d'amener à une voie en particulier, à quai par exemple, qui n'est pas une voie extrême.

1135
Le logiciel DCC++ / Re : Re : Re : DCC++ BaseStation
« le: mars 09, 2016, 11:19:42 pm »
GameBoy Pocket  :o

Pas jeune la bestiole (tu n'étais pas né  ???)

N'exagérons rien  :D. Elle est sortie en 1996 d'après Wikipedia et je n'ai plus 20 ans  ;)

1136
Le logiciel DCC++ / Re : DCC++ BaseStation
« le: mars 09, 2016, 07:41:00 pm »
GameBoy Pocket  :o

1137
Encore mon histoire d'émulation qui joue des tours. Du coup j'ai tout viré. L'archive mise à jour est à télécharger ci-dessous.

1138
Le logiciel DCC++ / Re : Re : Re : DCC++ BaseStation
« le: mars 09, 2016, 04:10:21 pm »
Donc je peux enlever l' \ dans la version expansée. Il n'a aucun effet sur le compilateur ?

Oui  :)

1139
Le logiciel DCC++ / Re : DCC++ BaseStation
« le: mars 09, 2016, 03:13:43 pm »
Pour le préprocesseur, la fin de ligne termine la macro. Ici la macro est très grosse et donc c'est impossible de l'écrire sur une seule ligne. Le \ permet d'échapper le caractère qui suit. Ici le caractère qui suit est le retour à la ligne. Donc les fin de lignes ne sont pas vue par le préprocesseur et la macro est vue comme étant sur une seul ligne comma attendu. Du point de vue du formatage, c'est lisible.

1140
Tu as connecté le DUE via le programming port ?

Pages: 1 ... 74 75 [76] 77 78 ... 95