Merci
Bon c'est quand même tout à plat tout ça. Il n'y a pas de mystère. Pour moins dupliquer du code, il faut normaliser les données et sans doute passer les constantes en données.
La première chose que je ferais c'est de définir une struct ou une class (mieux) décrivant les objets que vous utilisez. Par exemple certains canton ont un feu rouge donc :
class Feu {
byte rouge;
byte orange;
byte vert;
...
};
Pour les cantons :
class Canton {
boolean circuler; //memoire inter "autorisation de circuler canton"
boolean arret; //memoire pas inter "autorisation de circuler canton"
byte potar;//consigne de vitesse canton
unsigned long datetempovitesse;
...
public:
Canton(const byte inPotar, ...) : circuler(false), arret(false), potar(inPotar), datetempovitesse(0), ...
...
};
Ensuite on instancie autant de cantons que nécessaire.
Canton G1(A0, ...);
Canton C1(A1, ...);
Mutualiser les interruptions doit être faisable mais il faudrait savoir de quelle broche vient l'interruption (ie l'avoir en donnée). Il faudrait faire une version modifiée de PinChangeInt car la version commune fait exactement ce que vous ne voulez pas : distribuer une interruption commune à 8 pins sur 8 fonctions alors qu'il faudrait récupérer le canton correspondant à la pin et avec un seul code traiter le canton en question.
Une fois les objets canton créés, c'est facile de mutualisme le code des lignes 312 à 419 mais je vois des irrégularité dans l'init du grafcet
438 à 450, idem
Les aiguilles je sais pas, la topologie de votre réseau est câblée en dur dans le code.
Idem, il semble qu'il ait des cas particuliers dans la gestion de chaque canton (j'ai diagonalisé, il y a plus de 1000 lignes de code) mais les différents cantons appartiennent-il à des catégories en nombre limité ? Si oui, en utilisant une classe de base Canton avec une ou plusieurs méthodes virtuelles et une classe dérivée par catégorie permet de mutualiser la structure du code et d'en écrire un minimum.