From 864a101dc53b4644bf1c79ca6c1c043549339d73 Mon Sep 17 00:00:00 2001 From: f1iwq2 Date: Sun, 13 Feb 2022 11:04:32 +0100 Subject: [PATCH] V3.62 --- UnitDebug.dcu | Bin 20815 -> 22356 bytes UnitDebug.dfm | 64 +++++--- UnitDebug.pas | 35 +++++ UnitPrinc.dcu | Bin 190214 -> 192659 bytes UnitPrinc.pas | 392 ++++++++++++++++++++++++++++++---------------- verif_version.dcu | Bin 11067 -> 11068 bytes verif_version.dfm | 4 +- verif_version.pas | 6 +- versions.txt | 2 + 9 files changed, 337 insertions(+), 166 deletions(-) diff --git a/UnitDebug.dcu b/UnitDebug.dcu index a7e77b408fb510495c280f7742eb951f538e6ac2..c54f95c4799403bf8e7dcb91921f7ae04c51aa01 100644 GIT binary patch delta 6420 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 delta 5401 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 then exit; + Val(s2,Actuel,erreur); if erreur<>0 then exit; + Adr:=suivant_Alg3(prec,type1,actuel,type2,1); + if Adr<9996 then + begin + s:='L''élément suivant aux éléments '+IntToSTR(prec)+'/'+IntToSTR(actuel)+' est '+IntToSTR(Adr)+' '; + case typeGen of + aig : s:=s+'aiguillage'; + tjd : s:=s+'tjd'; + tjs : s:=s+'tjs'; + triple : s:=s+'triple'; + det : s:=s+'détecteur'; + buttoir : s:=s+'buttoir'; + end; + AfficheDebug(s,clYellow); + end + else AfficheDebug('Pas trouvé d''élement suvant aux éléments '+IntToSTR(prec)+'/'+IntToSTR(actuel),clyellow); + NivDebug:=AncDebug; + +end; + end. diff --git a/UnitPrinc.dcu b/UnitPrinc.dcu index d21508cc16980d24c52bf288a06037ea5eb60502..f73e602b90c9f5dd9025c35e228aac36696bdc26 100644 GIT binary patch delta 30276 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~_k^9>PItUH-cM{AGbP-Y? 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 delta 28427 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 diff --git a/UnitPrinc.pas b/UnitPrinc.pas index 82317d9..d78f15c 100644 --- a/UnitPrinc.pas +++ b/UnitPrinc.pas @@ -3,7 +3,7 @@ Unit UnitPrinc; programme signaux complexes Graphique Lenz delphi 7 + activeX Tmscomm + clientSocket ******************************************** - 8/2/2022 14h + 13/2/2022 11h00 note sur le pilotage des accessoires: raquette octet sortie + 2 = aiguillage droit = sortie 2 de l'adresse d'accessoire @@ -377,7 +377,7 @@ var Aig_supprime,Aig_sauve : TAiguillage; Fimage : Timage; - BrancheN : array[1..100,1..200] of TBranche; // + BrancheN : array[1..100,1..200] of TBranche; {$R *.dfm} @@ -409,7 +409,7 @@ function etat_signal_suivant(Adresse,rang : integer) : integer; function suivant_alg3(prec : integer;typeELprec : TEquipement;actuel : integer;typeElActuel : TEquipement;alg : integer) : integer; function detecteur_suivant_El(el1: integer;TypeDet1 : TEquipement;el2 : integer;TypeDet2 : TEquipement;alg : integer) : integer ; function test_memoire_zones(adresse : integer) : boolean; -function PresTrainPrec(AdrFeu : integer) : boolean; +function PresTrainPrec(Adresse : integer) : boolean; function cond_carre(adresse : integer) : boolean; function carre_signal(adresse : integer) : boolean; procedure Event_Detecteur(Adresse : integer;etat : boolean;train : string); @@ -665,7 +665,7 @@ begin Temp:=HtImage-ySem; YSem:=XSem;XSem:=Temp; Temp:=HtImage-yvert; Yvert:=Xvert;Xvert:=Temp; end; - + if (orientation=3) then begin //rotation 90° vers la droite des feux @@ -1743,7 +1743,7 @@ begin end; // mise à jour de l'état du signal dans le tableau Feux i:=Index_feu(adresse); - feux[i].EtatSignal:=EtatSignalCplx[adresse]; + if i<>0 then feux[i].EtatSignal:=EtatSignalCplx[adresse]; end; @@ -2732,9 +2732,9 @@ begin if ((aspect=2) and (UniSem=2)) or ((aspect=3) and (UniSem=3)) or ((aspect=4) and (UniSem=4)) or - ((aspect=5) and ((UniSem=51) or (UniSem=52))) or - ((aspect=7) and ((UniSem=71) or (UniSem=72) or (UniSem=73))) or - ((aspect=9) and ((UniSem>=90) or (UniSem<=99))) + ((aspect=5) and ((UniSem=51) or (UniSem=52))) or + ((aspect=7) and ((UniSem=71) or (UniSem=72) or (UniSem=73))) or + ((aspect=9) and ((UniSem>=90) or (UniSem<=99))) then Verif_unisemaf:=0 else Verif_Unisemaf:=2; end; @@ -2786,6 +2786,7 @@ end; // renvoie élément suivant entre deux éléments quels qu'ils soient mais contigus +// attention, si les éléments ne sont pas contigus, le résultat est erronné!!! // et en variables globales: typeGen le type de l'élément // s'ils ne sont pas contigus, on aura une erreur // alg= algorithme : @@ -2811,6 +2812,7 @@ var Adr,AdrPrec,indexBranche_prec,branche_trouve_prec,indexBranche_actuel,branc if (typeGen=tjd) then // si le précédent est une TJD/S et le suivant aussi , substituer pointe (chgt de actuel en VAR dans la déclaration de alg3) begin IndexAdr:=index_aig(Adr); + IndexActuel:=index_aig(Actuel); if ((aiguillage[IndexAdr].modele=tjd) or (aiguillage[indexAdr].modele=tjs)) and ((aiguillage[indexActuel].modele=tjd) or (aiguillage[indexActuel].modele=tjs)) then @@ -3354,9 +3356,8 @@ begin substitue; exit; end; - s:='1026 - Erreur fatale - position TJD/S '+IntToSTR(Adr)+'/'+intToSTR(AdrTJDP)+' inconnue'; - Affiche(s,clred); - AfficheDebug(s,clred); + s:='1026 - position TJD/S '+IntToSTR(Adr)+'/'+intToSTR(AdrTJDP)+' inconnue'; + AfficheDebug(s,clOrange); suivant_alg3:=9999;exit; end; @@ -3492,7 +3493,7 @@ end; // algo= type d'algorythme pour suivant_alg3 function detecteur_suivant(prec : integer;TypeElPrec : TEquipement;actuel : integer;TypeElActuel : TEquipement;algo : integer) : integer ; var actuelCalc,PrecCalc,j,AdrSuiv ,indexCalc : integer; - TypeprecCalc,TypeActuelCalc : TEquipement; + TypeprecCalc,TypeActuelCalc : TEquipement; begin if NivDebug>=2 then AfficheDebug('Proc Detecteur_suivant '+IntToSTR(prec)+','+IntToSTR(BTypeToNum(typeElPrec))+'/'+intToSTR(actuel)+','+ @@ -3606,7 +3607,7 @@ var IndexBranche_det1,IndexBranche_det2,branche_trouve_det1,branche_trouve_det2, TypePrec,TypeFonc : Tequipement; s : string; label reprise; - + begin if NivDebug>=2 then AfficheDebug('Proc Detecteur_suivant_EL '+intToSTR(el1)+','+intToSTR(BTypeToNum(Typedet1))+'/'+intToSTR(el2)+','+intToSTR(BTypeToNum(Typedet2))+'-------------------------',clLime); @@ -3647,7 +3648,7 @@ begin j:=1; // J=1 test en incrément J=2 test en décrément // étape 1 : trouver le sens de progression (en incrément ou en décrément) - + repeat //préparer les variables AdrPrec:=el1;TypePrec:=typeDet1; @@ -3694,7 +3695,7 @@ begin sortie:=((typeDet2=TypeGen) and (Adr=el2)) or (Adr=0) or (Adr>=9996) or (i=15) or (N_Det=Nb_det_dist); until sortie ; if (i=15) and (Nivdebug=3) then afficheDebug('Pas trouvé',clyellow); - if (N_det=Nb_det_dist) and (Nivdebug=3) then + if (N_det=Nb_det_dist) and (Nivdebug=3) then begin s:='Elements trop distants '+intToStr(el1)+' '+intToSTR(el2); afficheDebug(s,clorange); @@ -3765,7 +3766,7 @@ begin if i=0 then begin Affiche('Erreur 602 - feu '+IntToSTR(adresse)+' non trouvé',clred); - if NivDebug=3 then AfficheDebug('Erreur 602 - feu '+IntToSTR(adresse)+' non trouvé',clred); + if NivDebug=3 then AfficheDebug('Erreur 602 - feu '+IntToSTR(adresse)+' non trouvé',clred); cond_carre:=true; exit; end; @@ -3816,10 +3817,10 @@ begin if (NivDebug>=1) then AfficheDebug('Test si signal '+IntToSTR(adresse)+' doit afficher un carré si aiguillage avals mal positionnés',clyellow); i:=Index_feu(adresse); - if i=0 then + if i=0 then begin Affiche('Erreur 603 - feu '+IntToSTR(adresse)+' non trouvé',clred); - if NivDebug=3 then AfficheDebug('Erreur 603 - feu '+IntToSTR(adresse)+' non trouvé',clred); + if NivDebug=3 then AfficheDebug('Erreur 603 - feu '+IntToSTR(adresse)+' non trouvé',clred); carre_signal:=true; exit; end; @@ -3898,6 +3899,12 @@ begin //traceDet:=true; if NivDebug>=2 then AfficheDebug('Cherche état du signal suivant au '+IntToSTR(adresse),clyellow); i:=Index_feu(adresse); + if i=0 then + begin + if NivDebug>=2 then AfficheDebug('Feu '+IntToSTR(adresse)+' non trouvé',clyellow); + etat_signal_suivant:=0; + exit; + end; if feux[i].aspect>10 then begin s:='La demande de l''état du signal suivant depuis un feu directionnel '+IntToSTR(Adresse)+' est irrecevable'; @@ -3967,9 +3974,9 @@ begin if (TypeActuel=det) then // détecteur? begin i:=Index_feu_det(Actuel); // trouve l'index de feu affecté au détecteur "Actuel" - AdrFeu:=Feux[i].Adresse; - if adrFeu<>0 then + if i<>0 then begin + AdrFeu:=Feux[i].Adresse; if nivdebug=3 then afficheDebug('Détecteur='+IntToSTR(AdrSuiv)+' AdrFeu='+IntToSTR(AdrFeu)+' prec='+IntToSTR(prec),clyellow ); if (adrFeu=Adresse) then // si on ne reboucle sur le même signal dont on cherche le suivant begin @@ -4014,6 +4021,11 @@ begin if NivDebug>=2 then AfficheDebug('Test si aiguille déviée après signal '+IntToSTR(Adresse),clyellow); j:=0; i:=Index_feu(adresse); + if i=0 then + begin + Affiche('Erreur 168: signal '+intToSTR(adresse)+' non trouvé',clred); + exit; + end; prec:=feux[i].Adr_det1; TypePrec:=det; actuel:=feux[i].Adr_el_suiv1; @@ -4115,13 +4127,13 @@ end; // adresse=adresse du signal function test_memoire_zones(adresse : integer) : boolean; var - AdrSuiv,prec,ife,actuel,Etat,AdrFeu,i,j,PresTrain01,PrecInitial, - N_Det : integer; + AdrSuiv,prec,ife,actuel,i,j, + dernierdet,AdrFeu,Nfeux,NFeuxMax : integer; TypePrec,TypeActuel : TEquipement; - Pres_train,sort : boolean; + Pres_train : boolean; s : string; begin - if NivDebug>=1 then AfficheDebug('Proc test_memoire_zones('+intToSTR(adresse)+') au signal suivant ',clyellow); + if NivDebug>=1 then AfficheDebug('Proc test_memoire_zones('+intToSTR(adresse)+')',clyellow); i:=Index_feu(adresse); if (i=0) then begin @@ -4130,123 +4142,114 @@ begin test_memoire_zones:=false; end; + Nfeux:=0; + NFeuxMax:=1; // nombre de feux à trouver (nombre de cantons) Pres_train:=FALSE; ife:=1; // index feu de 1 à 4 pour explorer les 4 détecteurs d'un feu repeat j:=0; - N_Det:=0; if NivDebug=3 then AfficheDebug('Boucle de test feu '+intToSTR(ife)+'/4',clOrange); if (ife=1) then begin prec:=feux[i].Adr_det1; - actuel:=feux[i].Adr_el_suiv1; + Actuel:=feux[i].Adr_el_suiv1; TypeActuel:=feux[i].Btype_suiv1; end; //détecteur sur le signal courant if (ife=2) then begin prec:=feux[i].Adr_det2; - actuel:=feux[i].Adr_el_suiv2; + Actuel:=feux[i].Adr_el_suiv2; TypeActuel:=feux[i].Btype_suiv2; end; // détecteur sur le signal courant if (ife=3) then begin prec:=feux[i].Adr_det3; - actuel:=feux[i].Adr_el_suiv3; + Actuel:=feux[i].Adr_el_suiv3; TypeActuel:=feux[i].Btype_suiv3; end; // détecteur sur le signal courant if (ife=4) then begin prec:=feux[i].Adr_det4; - actuel:=feux[i].Adr_el_suiv4; + Actuel:=feux[i].Adr_el_suiv4; TypeActuel:=feux[i].Btype_suiv4; end; // détecteur sur le signal courant TypePrec:=det; - if (prec=0) then - begin - // sortie si aucun détecteur déclaré sur le feu - test_memoire_zones:=Pres_train; - exit; - end; + dernierdet:=prec; - PrecInitial:=Prec; + // purge les aiguillages après le feu + if TypeActuel=aig then repeat - inc(j); - // à la première itération, si "actuel" est déja un détecteur, ne pas faire de recherche sur le suivant - // et chaîner mémoire de zone - if (j=1) and (Typeactuel=det) then // si détecteur + AdrSuiv:=suivant_alg3(prec,TypePrec,actuel,TypeActuel,1); + if (AdrSuiv>9900) or (AdrSuiv=0) then begin - Pres_train:=MemZone[Prec,actuel]; - if Pres_Train and (NivDebug=3) then Affiche('Présence train de '+intToSTR(prec)+' à '+intToSTR(actuel),clyellow); - end - else - begin - AdrSuiv:=suivant_alg3(prec,TypePrec,actuel,TypeActuel,1); - if Typegen=det then inc(N_Det); - prec:=actuel;TypePrec:=TypeActuel; - actuel:=AdrSuiv;TypeActuel:=typeGen; - if AdrSuiv>9990 then - begin - test_memoire_zones:=false;exit; - end; - end; - - if NivDebug=3 then AfficheDebug('132 - suivant='+IntToSTR(adrsuiv)+'/'+BtypeToChaine(TypeGen),clYellow); - if actuel=0 then - begin - // si c'est un buttoir - test_memoire_zones:=false; - if NivDebug=3 then AfficheDebug('sortie car buttoir',clyellow); + test_memoire_zones:=Pres_train; exit; end; - // si le suivant est un détecteur ; contrôler mémoire de zone et comporte t-il un signal? - AdrFeu:=0; - if (TypeActuel=det) then // détecteur + prec:=actuel;TypePrec:=TypeActuel; + actuel:=AdrSuiv;TypeActuel:=typeGen; + until typeactuel=det; + + repeat + inc(j); + + if (typeactuel=det) and (dernierdet<>0) then begin - if (NivDebug>0) and MemZone[PrecInitial][actuel] then AfficheDebug('Présence train de '+intToSTR(PrecInitial)+' à '+intToSTR(actuel),clyellow); - - Pres_train:=MemZone[PrecInitial][actuel] or Pres_train; // mémoire de zone - if Pres_Train then PresTrain01:=1 else PresTrain01:=0; - if NivDebug=3 then AfficheDebug('de '+IntToSTR(PrecInitial)+' à '+intToSTR(actuel)+'='+IntToSTR(PresTrain01),clyellow); - precInitial:=actuel; // pour préparer le suivant - - i:=index_feu_det(AdrSuiv); // renvoie l'index du signal se trouvant au détecteur "AdrSuiv": il peut y avoir 4 détecteurs par signal - AdrFeu:=feux[i].adresse; // adresse du feu - if (AdrFeu=adresse) then // si on ne reboucle sur le même signal dont on cherche le suivant + Pres_train:=MemZone[dernierdet,actuel] or Pres_Train; + if (nivDebug=3) then begin - AdrFeu:=0;j:=10; // on ne trouve pas de suivant + if Pres_Train then AfficheDebug('Présence train de '+intToSTR(dernierdet)+' à '+intToSTR(actuel),clyellow) + else AfficheDebug('Absence train de '+intToSTR(dernierdet)+' à '+intToSTR(actuel),clyellow) end; - if (AdrFeu<>0) then // si l'adresse est <>0 - begin - if (feux[i].Adr_el_suiv1<>prec) then // le feu est-il dans le bon sens de progression? - begin - s:='Trouvé feu '+IntToSTR(AdrFeu); - if (NivDebug>0) And Pres_Train then AfficheDebug(s+' et mémoire de zone à 1',clyellow); - if (NivDebug>0) And (not(Pres_Train)) then AfficheDebug(s+' et sortie proced:Mémoire de zone à 0',clyellow); - test_memoire_zones:=Pres_train;exit; + dernierdet:=actuel; - end - else + i:=index_feu_det(Actuel); // renvoie l'index du signal se trouvant au détecteur "AdrSuiv": il peut y avoir 4 détecteurs par signal + if i<>0 then + begin + AdrFeu:=feux[i].adresse; // adresse du feu + if (AdrFeu=adresse) then // si on ne reboucle sur le même signal dont on cherche le suivant begin - if NivDebug=3 then AfficheDebug('Trouvé feu '+intToSTR(AdrFeu)+' mais dans le mauvais sens',clOrange); - AdrFeu:=0; + AdrFeu:=0;j:=10; // on ne trouve pas de suivant + test_memoire_zones:=false; + exit; + end; + if (AdrFeu<>0) then // si l'adresse est <>0 + begin + if (feux[i].Adr_el_suiv1<>prec) then // le feu est-il dans le bon sens de progression? + begin + inc(Nfeux); + j:=0; + s:='Trouvé feu ('+IntToSTR(nfeux)+'/'+intToSTR(NFeuxMax)+') '+IntToSTR(AdrFeu); + if (NivDebug>0) And Pres_Train then AfficheDebug(s+' et mémoire de zone à 1',clyellow); + if (NivDebug>0) And (not(Pres_Train)) then AfficheDebug(s+' et mémoire de zone à 0',clOrange); + if nFeux=NFeuxMax then + begin + test_memoire_zones:=Pres_train; + exit; + end; + end + else + begin + if NivDebug=3 then AfficheDebug('Trouvé feu '+intToSTR(AdrFeu)+' mais dans le mauvais sens',clYellow); + AdrFeu:=0; + end; end; - end - else - begin - //if (traceDet) {sprintf(Affiche,"Trouvé détecteur %d mais sans signal\r\n",AdrSuiv,Etat);Display(Affiche); - AdrFeu:=0; end; - end - else - begin - if (NivDebug=3) then AfficheDebug('Trouvé aiguillage '+intToSTR(AdrSuiv),clyellow); end; - sort:=(j=10) or (AdrFeu<>0) or (N_Det>=Nb_det_dist); - until (sort); // on arrete jusqu'à trouver un signal ou si on va trop loin (10 itérations) + + AdrSuiv:=suivant_alg3(prec,TypePrec,actuel,TypeActuel,1); + if (AdrSuiv=0) or (AdrSuiv>9990) then + begin + test_memoire_zones:=Pres_train; + exit; + end; + prec:=actuel;TypePrec:=TypeActuel; + actuel:=AdrSuiv;TypeActuel:=typeGen; + + until (j=10); // on arrete si on va trop loin (10 itérations) inc(ife); until ife>=5; - if (NivDebug>0) and (Etat=0) then AfficheDebug('Pas trouvé de signal suivant au '+intToSTR(adresse),clyellow); + if (NivDebug>0) then AfficheDebug('Pas trouvé de signal suivant au '+intToSTR(adresse),clyellow); test_memoire_zones:=Pres_train; end; @@ -4306,7 +4309,7 @@ end; // trouve le détecteur suivant de det1 à det2 si la route est correcte. (détecteurs en entrée obligatoires) // transmis dans le tableau Event_det // Résultat: -// si >=9996 : pas de route +// si 9999 : pas de route // si 10 : ok route trouvée function test_route_valide(det1,det2,det3 : integer) : integer; var det_suiv,resultat : integer; @@ -4317,33 +4320,150 @@ begin test_route_valide:=9999; exit; - - if (det_suiv>=9996) or (det3<>det_suiv) then begin resultat:=0; NivDebug:=0;end; - // test sens inverse.... - if resultat=0 then +end; + +// présence train précédent les 3 cantons du signal (soit 4 feux avant) +function PresTrainPrec(Adresse : integer) : boolean; +var + AdrSuiv,prec,ife,actuel,i,j, + dernierdet,AdrFeu,Nfeux,NFeuxMax : integer; + TypePrec,TypeActuel : TEquipement; + Pres_train : boolean; + s : string; +begin + if NivDebug>=1 then AfficheDebug('Proc testTrainPrec('+intToSTR(adresse)+')',clyellow); + i:=Index_feu(adresse); + if (i=0) then begin - test_route_valide:=0;exit; - // si manipulation proche aiguillage - det_suiv:=detecteur_suivant_el(det3,det,det2,det,1); - if (det_suiv>=9996) or (det1<>det_suiv) then begin test_route_valide:=0; NivDebug:=0;exit;end; + Affiche('Erreur 605 - feu '+IntToSTR(adresse)+' non trouvé',clred); + AfficheDebug('Erreur 605 - feu '+IntToSTR(adresse)+' non trouvé',clred); + PresTrainPrec:=false; end; - test_route_valide:=10 ; + + Nfeux:=0; + NFeuxMax:=3; // nombre de feux à trouver (nombre de cantons) + Pres_train:=FALSE; + ife:=1; // index feu de 1 à 4 pour explorer les 4 détecteurs d'un feu + repeat + j:=0; + if NivDebug=3 then AfficheDebug('Boucle de test feu '+intToSTR(ife)+'/4',clOrange); + if (ife=1) then + begin + actuel:=feux[i].Adr_det1; + prec:=feux[i].Adr_el_suiv1; + Typeprec:=feux[i].Btype_suiv1; + end; //détecteur sur le signal courant + if (ife=2) then + begin + actuel:=feux[i].Adr_det2; + prec:=feux[i].Adr_el_suiv2; + Typeprec:=feux[i].Btype_suiv2; + end; // détecteur sur le signal courant + if (ife=3) then + begin + actuel:=feux[i].Adr_det3; + prec:=feux[i].Adr_el_suiv3; + Typeprec:=feux[i].Btype_suiv3; + end; // détecteur sur le signal courant + if (ife=4) then + begin + actuel:=feux[i].Adr_det4; + prec:=feux[i].Adr_el_suiv4; + Typeprec:=feux[i].Btype_suiv4; + end; // détecteur sur le signal courant + + TypeActuel:=det; + if actuel=0 then + begin + // sortie si aucun détecteur déclaré sur le feu + PresTrainPrec:=Pres_train; + exit; + end; + + dernierdet:=actuel; + + repeat + inc(j); + + AdrSuiv:=suivant_alg3(prec,TypePrec,actuel,TypeActuel,2); // 2 car arrêt sur aiguille en talon mal positionnée + if (AdrSuiv=0) or (AdrSuiv>9990) then + begin + PresTrainPrec:=Pres_train; + exit; + end; + + prec:=actuel;TypePrec:=TypeActuel; + actuel:=AdrSuiv;TypeActuel:=typeGen; + + if typeactuel=det then + begin + Pres_train:=MemZone[actuel,dernierdet] or Pres_Train; + if (nivDebug=3) then + begin + if Pres_Train then + begin + AfficheDebug('Présence train de '+intToSTR(actuel)+' à '+intToSTR(dernierdet),clyellow); + PresTrainPrec:=Pres_train; + exit; + end + else AfficheDebug('Absence train de '+intToSTR(actuel)+' à '+intToSTR(dernierdet),clyellow) + end; + dernierdet:=actuel; + + i:=index_feu_det(Actuel); // renvoie l'index du signal se trouvant au détecteur "AdrSuiv": il peut y avoir 4 détecteurs par signal + if i<>0 then + begin + AdrFeu:=feux[i].adresse; // adresse du feu + if (AdrFeu=adresse) then // si on ne reboucle sur le même signal dont on cherche le suivant + begin + AdrFeu:=0;j:=10; // on ne trouve pas de suivant + PresTrainPrec:=false; + exit; + end; + if (AdrFeu<>0) then // si l'adresse est <>0 + begin + if (feux[i].Adr_el_suiv1=prec) then // le feu est-il dans le bon sens de progression? + begin + inc(Nfeux); + j:=0; + s:='Trouvé feu ('+IntToSTR(nfeux)+'/'+intToSTR(NFeuxMax)+') '+IntToSTR(AdrFeu); + if (NivDebug>0) And Pres_Train then AfficheDebug(s+' et mémoire de zone à 1',clyellow); + if (NivDebug>0) And (not(Pres_Train)) then AfficheDebug(s+' et mémoire de zone à 0',clOrange); + if nFeux=NFeuxMax then + begin + PresTrainPrec:=Pres_train; + exit; + end; + end + else + begin + if NivDebug=3 then AfficheDebug('Trouvé feu '+intToSTR(AdrFeu)+' mais dans le mauvais sens',clYellow); + AdrFeu:=0; + end; + end; + end; + end; + until (j=10); // on arrete jusqu'à trouver un signal ou si on va trop loin (10 itérations) + inc(ife); + until ife>=5; + if (NivDebug>0) then AfficheDebug('Pas trouvé de signal suivant au '+intToSTR(adresse),clyellow); + PresTrainPrec:=Pres_train; end; // présence train 3 détecteurs avant le feu -function PresTrainPrec(AdrFeu : integer) : boolean; +function PresTrainPrecVieux(AdrFeu : integer) : boolean; var PresTrain : boolean; j,i,Det_initial,Adr_El_Suiv,DetPrec1,DetPrec2,DetPrec3,DetPrec4 : integer; Btype_el_suivant : TEquipement; begin - If NivDebug=3 then AfficheDebug('Proc PresTrainPrec('+intToSTR(AdrFeu)+') ---------------',clOrange); + If NivDebug=3 then AfficheDebug('Proc PresTrainPrec('+intToSTR(AdrFeu)+') ---------------',clOrange); i:=index_feu(Adrfeu); - if i=0 then + if i=0 then begin Affiche('Erreur 604 - feu '+IntToSTR(adrFeu)+' non trouvé',clred); - if NivDebug=3 then AfficheDebug('Erreur 604 - feu '+IntToSTR(adrFeu)+' non trouvé',clred); - PresTrainPrec:=false; + if NivDebug=3 then AfficheDebug('Erreur 604 - feu '+IntToSTR(adrFeu)+' non trouvé',clred); + PresTrainPrecVieux:=false; exit; end; @@ -4420,7 +4540,7 @@ begin if presTrain Then afficheDebug('présence train feu '+intToSTR(AdrFeu),clorange) else AfficheDebug('Absence train feu '+intToSTR(AdrFeu),clorange); end; - PresTrainPrec:=presTrain; + PresTrainPrecVieux:=presTrain; end; @@ -4513,7 +4633,7 @@ begin PresTrain:=false; // détecteurs précédent le feu , pour déterminer si leurs mémoires de zones sont à 1 pour libérer le carré if (Feux[index].VerrouCarre) and (Feux[index].aspect>=4) then presTrain:=PresTrainPrec(AdrFeu); - + if AffSignal then afficheDebug('Fin de la recherche des 4 détecteurs précédents-----',clOrange); // si le signal peut afficher un carré et les aiguillages après le signal sont mal positionnées ou que pas présence train avant signal et signal // verrouillable au carré, afficher un carré @@ -4666,8 +4786,8 @@ function buttoir_adjacent(adr : integer) : boolean; begin trouve_element(adr,det,1); // branche_trouve IndexBranche_trouve if Branche_trouve=0 then begin buttoir_adjacent:=false;exit;end; - buttoir_adjacent:=( (BrancheN[branche_trouve,IndexBranche_trouve+1].Adresse=0) and (BrancheN[branche_trouve,IndexBranche_trouve+1].BType=buttoir) or - (BrancheN[branche_trouve,IndexBranche_trouve-1].Adresse=0) and (BrancheN[branche_trouve,IndexBranche_trouve-1].BType=buttoir) ) + buttoir_adjacent:=( (BrancheN[branche_trouve,IndexBranche_trouve+1].Adresse=0) and (BrancheN[branche_trouve,IndexBranche_trouve+1].BType=buttoir) or + (BrancheN[branche_trouve,IndexBranche_trouve-1].Adresse=0) and (BrancheN[branche_trouve,IndexBranche_trouve-1].BType=buttoir) ) end; // calcul des zones depuis le tableau des fronts descendants des évènements détecteurs @@ -5190,13 +5310,15 @@ label mise0; begin //Affiche(IntToSTR(adresse)+' '+intToSTr(octet),clYellow); - index:=index_aig(adresse); - // test si pilotage aiguillage inversé - if (acc=aigP) and (aiguillage[index].inversionCDM=1) then + if (acc=aigP) then begin - if octet=1 then octet:=2 else octet:=1; - end; + index:=index_aig(adresse); + if (aiguillage[index].inversionCDM=1) then + begin + if octet=1 then octet:=2 else octet:=1; + end; + end; // pilotage par CDM rail ----------------- if CDM_connecte then @@ -6050,19 +6172,17 @@ begin Affiche('Fin des initialisations',clyellow); LabelEtat.Caption:=' '; Affiche_memoire; - { - aiguillage[index_aig(7)].position:=const_devie; - aiguillage[index_aig(20)].position:=const_droit; - aiguillage[index_aig(21)].position:=const_droit; + { + aiguillage[index_aig(1)].position:=const_devie; + aiguillage[index_aig(3)].position:=const_droit; + aiguillage[index_aig(4)].position:=const_devie; aiguillage[index_aig(25)].position:=const_devie; aiguillage[index_aig(26)].position:=const_droit; aiguillage[index_aig(27)].position:=const_droit; aiguillage[index_aig(28)].position:=const_droit; aiguillage[index_aig(31)].position:=const_devie; - } - //i:=suivant_alg3(520,det,20,aig,1); - - + aiguillage[index_aig(9)].position:=const_droit; + } end; @@ -6421,13 +6541,14 @@ var s : string; i : word; coche : boolean; begin - Cb:=Sender as TcheckBox; + Cb:=Sender as TcheckBox; coche:=cb.Checked; // état de la checkbox - s:=Cb.Hint; + s:=Cb.Hint; val(s,adresse,erreur); // adresse du signal correspondant au checkbox cliqué if erreur=0 then begin i:=index_feu(adresse); + if i=0 then exit; etat:=feux[i].EtatSignal; affiche(IntToSTR(etat),clyellow); // si le feu est vert et que la coche est mise, substituer le blanc @@ -7386,9 +7507,10 @@ begin val(s,vit,erreur); if (erreur<>0) or (vit<0) then exit; s:=trains[combotrains.itemindex+1].nom_train; - Affiche('Commande vitesse train '+s+ ' à '+IntToSTR(vit)+'%',cllime); vitesse_loco(s,adr,vit,true); - + if s='' then s:=intToSTR(adr); + Affiche('Commande vitesse train '+s+ ' à '+IntToSTR(vit)+'%',cllime); + end; // pour déplacer l'ascenseur de l'affichage automatiquement en bas diff --git a/verif_version.dcu b/verif_version.dcu index bf1b6670920f24ab72f6e50d4ac4e03d4fee7352..bddaf62b12ea4fe5c1b93b7645e68d1b7b5d59e8 100644 GIT binary patch delta 540 zcmdlTwkM4HJ_7^4jWz=VdxY;qZdqy82;UHfBEhoMqRg~-AX%K5pQo3Smb-GI=SF84 zL1F)niUt`bssBL0!oa{_tY>DpxlmAvk;GmS$F6kuyl9p3ZQgaH}8ze`EpX~OMp@k@u^FI;=Qha zcJ6=)Wjq10{+E8qVBnm*LC#cMfD@{AhXIWBT5Lzp>;0@=J>qN=q_x zGK*8I6mk+3ps}F<3UdX8+{Dach0Gj<)QZgFl2l~*&GCx;tc+Td->a=-blp5pU6@hI zj4g%9jVXXdfK84`ghhfyf=z^H0!t?om+t1%8i|a247@B1ObmaSML`t9WIL_D05e~; Ang9R* delta 488 zcmdlJwmXdbJ_7^4wKfC8`bqW^xn-r-PO=YSC=x77Ey_%b2a?5^`FVONX}RAg+irB0 z5foaxtE54ON#Z{cFf%YP80(pCE)rB?WHj77RY;kM@!{s3BCA=H_OdZBr2IEX=~P$< zRK(C=!NA}0l@-Xa1#y9#7n9p0Z5bzRJ|bDe#HhR3QAV1PQE+mstc1!BMh1qvt|#uq zUbz2YUXcWx$=_NBlxg^_z~5Fnd8Vum0#wu;`Ufo8-MRuOnbyraWpbgMl==do6hwUL5}z|!l zU_u!WfUN(eUo!r1Ox`4CD$c_RRl7q6#(FKbqhs|?^GNn@>cWgtCTuB8ZcG6z0&H?jA}kUt5^N$o6IeQ#xD+>E&`4wyI?Tw< V%fi6K@RwN>M0s0 then begin Aff('Nouveautés de la V'+version_p+SV_publie+' de Signaux_Complexes_GL :'); - Aff(' '); - for i:=1 to ncomm do aff(comm[i]); + aff(' '); + for i:=1 to ncomm-1 do aff(comm[i]); end; if MessageDlg(s+'. Voulez-vous la télécharger?',mtConfirmation,[mbYes,mbNo],0)=mrYes then begin diff --git a/versions.txt b/versions.txt index d79171d..1a58538 100644 --- a/versions.txt +++ b/versions.txt @@ -78,6 +78,8 @@ version 3.6 : Am Correction d'affichage du TCO. Correction des messages transmis de CDM. Changement des vitesses courantes des trains. +version 3.61 : Correction de la non présentation de certains signaux s'ils sont séparés par plus d'un détecteur. +version 3.62 : Correction présence trains 3 cantons avant signaux et 1 canton après signaux.