1111
Modélisation, Architectures logicielles et matérielles / Re : Modélisation logicielle d'un réseau - le système de Jean-Luc
« le: mars 09, 2016, 03:09:34 pm »
Tu as connecté le DUE via le programming port ?
Le forum LOCODUINO est consacré aux discussions ayant trait à l'utilisation de l'Arduino dans les automatismes et les animations pour le train miniature. Nous avons eu récemment quelques inscriptions de personnes ayant des projets plus généraux mais surtout inapplicables au train miniature. Si votre projet ou vos questions ne concernent pas le modélisme ferroviaire, ne vous inscrivez pas, vous perdriez votre temps et nous aussi.
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.
Si je voulais être caustique, je dirais « le droit de concourir à The International Obfuscated C Code Contest » http://www.ioccc.org
Plus sérieusement, bien fait ça donne un code (légèrement) plus efficace tout en restant concis. Personnellement je n'aime pas. Il y a tellement de possibilités de se faire avoir par le préprocesseur qu'il ne vaut mieux pas s'y frotter de cette manière
Donc, qu'est-ce ça donne en clair ?
OCR ## N ## A=DCC_ONE_BIT_TOTAL_DURATION_TIMER ## N
OCR1A=DCC_ONE_BIT_TOTAL_DURATION_TIMER1
#define OCR1A _SFR_MEM16(0x88)
_SFR_MEM16(0x88)=3199
mais il reste une syntaxe dans DCCpp_Uno.ino que je n'ai pas comprise (ligne 443) :Code: [Sélectionner]if(R.currentReg->activePacket->buf[R.currentBit/8] & R.bitMask[R.currentBit%8]){
OCR ## N ## A=DCC_ONE_BIT_TOTAL_DURATION_TIMER ## N;
OCR ## N ## B=DCC_ONE_BIT_PULSE_DURATION_TIMER ## N;
} else{ /* ELSE it is a ZERO */
OCR ## N ## A=DCC_ZERO_BIT_TOTAL_DURATION_TIMER ## N;
OCR ## N ## B=DCC_ZERO_BIT_PULSE_DURATION_TIMER ## N;
} /* END-ELSE */
est-ce que ## est un opérateur ?? J'avoue que je sèche.
Il y a un truc qui m'intéresserait : comment mettre des images dans le dossier www.locoduino.org/pic ?
C'est peut-être réservé à l'admin ?
Sur ton schéma, Jean-Luc, chaque flèche est un pointeur.
Pour tjd12, pointeur de mVoieEntrant = voie8 et pointeur de mVoieEntrantBis = voie21
De même pour voie8, pointeur de mVoieSortant = tjd12 et pour voie21, pointeur de mVoieSortant = tjd12
Dans le test if (venantDe == mVoieSortantDroit) {..},
mVoieSortantDroit est un élément de la classe Voie et donc ce n'est pas un pointeur.
Voie *mVoieSortantDroit;
Il y a deux mVoieSortantDroit : celui de la voie8 et celui de la voie21 et il faut donc choisir.
Tu es dans bool traverseeJonctionDouble(...), donc tu es sur la tjd12 et tu recherches les antécédents pour pouvoir créer un chemin qui va venir soit de la voie8, soit de la voie21.
Quand tu rentres comme argument de bool(...) Voie *venantDe, tu veux préciser en entrée que tu viens de la voie8 ou que tu viens de la voie21.
Admettons qu'on vienne de la voie8.
Est-ce que je peux dire, dans tjd12, que Voie *venantDe = voie8 ?
Par ailleurs, dans voie8, mSortantDroit, pointe vers tjd12.
Est-ce que je peux dire, dans voie8 cette fois, que *mSortantDroit = tjd12 ?
J'ai bien conscience que ça va "polluer" ton exposé, mais je me pose quelques questions :
Code: [Sélectionner]#ifdef __AVR__
Je ne connais pas ___AVR__ ?
#include <avr/pgmspace.h>
#endif
#ifndef __AVR__
#include <iostream>
#define F(string) string
#define PROGMEM
Le simple fait de mettre #define DEBUG au début suffit pour pouvoir afficher les essais ?
Tu mets les sorties Serial.print() entre #ifdef DEBUG .... #endif et elles sont affichées et si tu dévalides le #define DEBUG pour ne plus les afficher.
C'est sympa, ça.
Et, dans mes efforts pour comprendre les pointeurs, je choisis "venantDe". Exemple :Code: [Sélectionner]bool Aiguillage::creeCheminVers(byte identifiant, byte dir, Voie *venantDe)
{
if (idVoie() == identifiant) return true;
else {
if (direction() == dir) {
if (mVoieSortantDroit != NULL) {
if (mVoieSortantDroit->creeCheminVers(identifiant, dir, this)) {
afficheNomVoie(idVoie());
Serial.println(F(": droit"));
return true;
}
else if (mVoieSortantDevie != NULL) {
if (mVoieSortantDevie->creeCheminVers(identifiant, dir, this)) {
afficheNomVoie(idVoie());
Serial.println(F(": devie"));
return true;
}
else return false;
}
else return false;
}
else return false;
}
else {
if (mVoieEntrant != NULL) {
if (mVoieEntrant->creeCheminVers(identifiant, dir, this)) {
afficheNomVoie(idVoie());
if (venantDe == mVoieSortantDroit) {
Serial.println(F(": droit"));
}
else {
Serial.println(F(": devie"));
}
return true;
}
else return false;
}
else return false;
}
}
}
Au début, il y a une étoile : Voie *venantDe
J'en déduis que c'est un pointeur ?
Puis, un peu plus loin dans un test, tu as : if (venantDe == mVoieSortantDroit)
Et là, c'est le contenu de la variable ?
voie8.connecteSortantAVoie(tjd12, ENTRANT);
voie21.connecteSortantAVoie(tjd12, ENTRANT_BIS);
void connecteAVoie(Voie &voie, byte connecteur);
void connecteSortantAVoie(Voie &voie, byte connecteur);
void connecteEntrantAVoie(Voie &voie, byte connecteur);
void connecteSortantDroitAVoie(Voie &voie, byte connecteur);
void connecteSortantDevieAVoie(Voie &voie, byte connecteur);
void connecteEntrantAVoie(Voie &voie, byte connecteur);
void connecteSortantAVoie(Voie &voie, byte connecteur);
void connecteSortantBisAVoie(Voie &voie, byte connecteur);
void connecteEntrantAVoie(Voie &voie, byte connecteur);
void connecteEntrantBisAVoie(Voie &voie, byte connecteur);
VoieNormale voieLibre0(VOIE_LIBRE_0);
Aiguillage aiguille0(AIGUILLE_0);
VoieNormale voie0(VOIE_0);
VoieNormale voie1(VOIE_1);
voieLibre0.connecteSortantAVoie(aiguille0, ENTRANT);
aiguille0.connecteSortantDevieAVoie(voie0, ENTRANT);
aiguille0.connecteSortantDroitAVoie(voie1, ENTRANT);
/*
* Connexion des voies de bas en haut et de gauche à droite
*/
voieLibre0.connecteSortantAVoie(aiguille0, ENTRANT);
aiguille0.connecteSortantDevieAVoie(voie0, ENTRANT);
aiguille0.connecteSortantDroitAVoie(voie1, ENTRANT);
voie0.connecteSortantAVoie(tjd0, ENTRANT_BIS);
voie1.connecteSortantAVoie(tjd8, ENTRANT_BIS);
voieLibre1.connecteSortantAVoie(tjd0, ENTRANT);
tjd0.connecteSortantAVoie(voie3, ENTRANT);
tjd0.connecteSortantBisAVoie(voie2, ENTRANT);
voie3.connecteSortantAVoie(tjd8, ENTRANT);
tjd8.connecteSortantAVoie(voie22, ENTRANT);
tjd8.connecteSortantBisAVoie(voie21, ENTRANT);
voie22.connecteSortantAVoie(aiguille12, SORTANT_DEVIE);
aiguille12.connecteEntrantAVoie(voieGarage2, SORTANT);
voie32.connecteSortantAVoie(aiguille12, SORTANT_DROIT);
voieLibre2.connecteSortantAVoie(tjd1, ENTRANT);
voie2.connecteSortantAVoie(tjd1, ENTRANT_BIS);
tjd1.connecteSortantAVoie(voie8, ENTRANT);
tjd1.connecteSortantBisAVoie(voie6, ENTRANT);
voie8.connecteSortantAVoie(tjd12, ENTRANT);
voie21.connecteSortantAVoie(tjd12, ENTRANT_BIS);
tjd12.connecteSortantAVoie(voie27, ENTRANT);
tjd12.connecteSortantBisAVoie(croisement2, ENTRANT_BIS);
voie27.connecteSortantAVoie(tjd15, ENTRANT_BIS);
croisement2.connecteSortantAVoie(tjd15, ENTRANT);
tjd15.connecteSortantBisAVoie(voie31, ENTRANT);
tjd15.connecteSortantAVoie(voie32, ENTRANT);
voie31.connecteSortantAVoie(aiguille11, ENTRANT);
aiguille11.connecteSortantDevieAVoie(voieGarage3, SORTANT);
aiguille11.connecteSortantDroitAVoie(voieGarage4, SORTANT);
voieLibre3.connecteSortantAVoie(tjd2, ENTRANT);
voie6.connecteSortantAVoie(tjd2, ENTRANT_BIS);
tjd2.connecteSortantAVoie(voie12, ENTRANT);
tjd2.connecteSortantBisAVoie(voie11, ENTRANT);
voie12.connecteSortantAVoie(tjd11, ENTRANT_BIS);
voie20.connecteSortantAVoie(tjd11, ENTRANT);
tjd11.connecteSortantBisAVoie(voie26, ENTRANT);
tjd11.connecteSortantAVoie(croisement2, ENTRANT);
voie26.connecteSortantAVoie(tjd14, ENTRANT);
croisement2.connecteSortantBisAVoie(tjd14, ENTRANT_BIS);
tjd14.connecteSortantAVoie(voie30, ENTRANT);
tjd14.connecteSortantBisAVoie(voie29, ENTRANT);
voie30.connecteSortantAVoie(aiguille10, ENTRANT);
aiguille10.connecteSortantDroitAVoie(voieGarage5, SORTANT);
aiguille10.connecteSortantDevieAVoie(voie34, ENTRANT);
voie34.connecteSortantAVoie(aiguille14, SORTANT_DROIT);
voie33.connecteSortantAVoie(aiguille14, SORTANT_DEVIE);
aiguille14.connecteEntrantAVoie(voieGarage6, SORTANT);
voieLibre4.connecteSortantAVoie(tjd4, ENTRANT);
voie11.connecteSortantAVoie(tjd4, ENTRANT_BIS);
tjd4.connecteSortantAVoie(voie16, ENTRANT);
tjd4.connecteSortantBisAVoie(croisement0, ENTRANT_BIS);
voie16.connecteSortantAVoie(tjd7, ENTRANT_BIS);
croisement0.connecteSortantAVoie(tjd7, ENTRANT);
tjd7.connecteSortantAVoie(voie20, ENTRANT);
tjd7.connecteSortantBisAVoie(voie19, ENTRANT);
voie19.connecteSortantAVoie(aiguille8, SORTANT_DROIT);
voie25.connecteSortantAVoie(aiguille8, SORTANT_DEVIE);
aiguille8.connecteEntrantAVoie(voie28, ENTRANT);
voie28.connecteSortantAVoie(tjd16, ENTRANT);
voie29.connecteSortantAVoie(tjd16, ENTRANT_BIS);
tjd16.connecteSortantAVoie(voie33, ENTRANT);
tjd16.connecteSortantBisAVoie(voieGarage7, SORTANT);
voieLibre5.connecteSortantAVoie(tjd3, ENTRANT_BIS);
voie10.connecteSortantAVoie(tjd3, ENTRANT);
tjd3.connecteSortantAVoie(croisement0, ENTRANT);
tjd3.connecteSortantBisAVoie(voie15, ENTRANT);
voie15.connecteSortantAVoie(tjd6, ENTRANT);
croisement0.connecteSortantBisAVoie(tjd6, ENTRANT_BIS);
tjd6.connecteSortantAVoie(voie18, ENTRANT);
tjd6.connecteSortantBisAVoie(croisement1, ENTRANT_BIS);
voie18.connecteSortantAVoie(tjd10, ENTRANT_BIS);
croisement1.connecteSortantAVoie(tjd10, ENTRANT);
tjd10.connecteSortantAVoie(voie25, ENTRANT);
tjd10.connecteSortantBisAVoie(voieGarage8, SORTANT);
voieLibre6.connecteSortantAVoie(aiguille3, SORTANT_DROIT);
voie5.connecteSortantAVoie(aiguille3, SORTANT_DEVIE);
aiguille3.connecteEntrantAVoie(aiguille4, ENTRANT);
aiguille4.connecteSortantDroitAVoie(voie9, ENTRANT);
aiguille4.connecteSortantDevieAVoie(voie10, ENTRANT);
voie9.connecteSortantAVoie(tjd5, ENTRANT_BIS);
voie14.connecteSortantAVoie(tjd5, ENTRANT);
tjd5.connecteSortantAVoie(croisement1, ENTRANT);
tjd5.connecteSortantBisAVoie(voie17, ENTRANT);
voie17.connecteSortantAVoie(tjd9, ENTRANT);
croisement1.connecteSortantBisAVoie(tjd9, ENTRANT_BIS);
tjd9.connecteSortantAVoie(voie24, ENTRANT);
tjd9.connecteSortantBisAVoie(voie23, ENTRANT);
voie24.connecteSortantAVoie(aiguille9, SORTANT_DROIT);
voie36.connecteSortantAVoie(aiguille9, SORTANT_DEVIE);
aiguille9.connecteEntrantAVoie(voieGarage9, SORTANT);
voieGarage0.connecteAVoie(aiguille1, ENTRANT);
aiguille1.connecteSortantDroitAVoie(voie5, ENTRANT);
aiguille1.connecteSortantDevieAVoie(voie4, ENTRANT);
voieGarage1.connecteAVoie(aiguille2, SORTANT_DEVIE);
voie4.connecteSortantAVoie(aiguille2, SORTANT_DROIT);
aiguille2.connecteEntrantAVoie(voie7, ENTRANT);
voie7.connecteSortantAVoie(aiguille5, ENTRANT);
aiguille5.connecteSortantDevieAVoie(voieLibre9, ENTRANT);
aiguille5.connecteSortantDroitAVoie(aiguille6, ENTRANT);
aiguille6.connecteSortantDroitAVoie(voieLibre8, ENTRANT);
aiguille6.connecteSortantDevieAVoie(aiguille7, ENTRANT);
aiguille7.connecteSortantDroitAVoie(voie14, ENTRANT);
aiguille7.connecteSortantDevieAVoie(voie13, ENTRANT);
voie13.connecteSortantAVoie(tjd13, ENTRANT);
voie23.connecteSortantAVoie(tjd13, ENTRANT_BIS);
tjd13.connecteSortantAVoie(voie36, ENTRANT);
tjd13.connecteSortantBisAVoie(voie35, ENTRANT);
voie35.connecteSortantAVoie(aiguille13, ENTRANT);
aiguille13.connecteSortantDroitAVoie(voieGarage10, SORTANT);
aiguille13.connecteSortantDevieAVoie(voieLibre7, ENTRANT);
class Voie
{
private:
byte mIdentifiant;
byte mDirection;
protected:
void fixeDirection(byte dir);
public:
Voie(byte identifiant) { mIdentifiant = identifiant; mDirection = AUCUNE_DIRECTION; }
byte idVoie() { return mIdentifiant; }
byte direction() { return mDirection; }
virtual void connecteDeVoie(Voie *voie, byte connecteur) = 0;
virtual bool creeCheminVers(byte identifiant, byte dir, Voie *venantDe = NULL) = 0;
};