From 8f2e8119a6b5ed87a50acf10a05f92ac44ead946 Mon Sep 17 00:00:00 2001 From: f1iwq2 Date: Thu, 2 Apr 2020 18:40:35 +0200 Subject: [PATCH] V1.5 --- UnitDebug.dcu | Bin 13023 -> 13168 bytes UnitDebug.pas | 7 +- UnitPilote.dcu | Bin 10650 -> 10725 bytes UnitPilote.pas | 8 +- UnitPrinc.dcu | Bin 177637 -> 181748 bytes UnitPrinc.dfm | 6 +- UnitPrinc.pas | 1046 +++++++++++++++++++++++++-------------------- UnitSimule.dcu | Bin 7386 -> 7693 bytes UnitSimule.dfm | 10 +- UnitSimule.pas | 16 +- UnitTCO.dcu | Bin 60784 -> 61249 bytes UnitTCO.pas | 81 +++- verif_version.dcu | Bin 9129 -> 9120 bytes verif_version.pas | 2 +- 14 files changed, 678 insertions(+), 498 deletions(-) diff --git a/UnitDebug.dcu b/UnitDebug.dcu index 8113368b53f180f848a9dd407df8c984fc56fe3d..3216e9093efdace5cee2e0f424c124662ce46ea8 100644 GIT binary patch delta 2685 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 diff --git a/UnitDebug.pas b/UnitDebug.pas index 49aefb0..482bcbb 100644 --- a/UnitDebug.pas +++ b/UnitDebug.pas @@ -55,6 +55,7 @@ type Const Max_Event_det_tick=10000; Max_event_det=400; +Max_Trains=50; var FormDebug: TFormDebug; @@ -62,6 +63,10 @@ var AffSignal,AffAffect,initform,AffFD : boolean; N_event_det : integer; // index du dernier évènement (de 1 à 20) event_det : array[1..Max_event_det] of integer; + event_det_train : array[1..Max_Trains] of record + NbEl : integer; + Det : array[1..3] of integer; // tableau des evts détecteurs par train + end; // tick 1/10s,détecteur N_Event_tick : integer ; // dernier index @@ -74,8 +79,6 @@ var actionneur : integer; objet : integer; // numéro d'objet dans CDM etat : integer ; // état du détecteur de l'aiguillage ou de l'actionneur - //train : integer ; - //suivant : integer ; // d'ou vient le train traite : boolean; // traité lors de a recherche d'une route end; diff --git a/UnitPilote.dcu b/UnitPilote.dcu index 5c827c9d702e82d4a2ed85fe0a71f532714ba4df..51dcbdcfeeb55690ac22a2c71010fb94fc68cdae 100644 GIT binary patch delta 561 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 diff --git a/UnitPrinc.dfm b/UnitPrinc.dfm index ac0c4fd..292bec4 100644 --- a/UnitPrinc.dfm +++ b/UnitPrinc.dfm @@ -1,6 +1,6 @@ object FormPrinc: TFormPrinc - Left = 55 - Top = 196 + Left = 56 + Top = 197 AutoSize = True BorderStyle = bsSingle Caption = 'Client TCP-IP CDM Rail ou USB - syst'#232'me LENZ' @@ -1415,7 +1415,7 @@ object FormPrinc: TFormPrinc Top = 136 Width = 97 Height = 25 - Caption = 'Simu D'#233'tecteur 513' + Caption = 'Test' TabOrder = 12 Visible = False OnClick = Button2Click diff --git a/UnitPrinc.pas b/UnitPrinc.pas index 1a10ed1..237d6c9 100644 --- a/UnitPrinc.pas +++ b/UnitPrinc.pas @@ -15,7 +15,7 @@ interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, StdCtrls, OleCtrls, ExtCtrls, jpeg, ComCtrls, + Dialogs, StdCtrls, OleCtrls, ExtCtrls, jpeg, ComCtrls, ShellAPI, ImgList, ScktComp, StrUtils, Menus, ActnList, MSCommLib_TLB , unitConfig ; type @@ -142,7 +142,6 @@ type procedure Codificationdesactionneurs1Click(Sender: TObject); procedure ButtonArretSimuClick(Sender: TObject); procedure OuvrirunfichiertramesCDM1Click(Sender: TObject); - private { Déclarations privées } procedure DoHint(Sender : Tobject); @@ -158,7 +157,7 @@ titre='Signaux complexes GL '; tempoFeu = 100; MaxAcc = 2048; LargImg=50;HtImg=91; -const_droit=2;const_devieD=1; // positions aiguillages transmises par la centrale LENZ +const_droit=2;const_devie=1; // positions aiguillages transmises par la centrale LENZ const_devieG_CDM=3; // positions aiguillages transmises par cdm const_devieD_CDM=2; // positions aiguillages transmises par cdm const_droit_CDM=0; // positions aiguillages transmises par cdm @@ -177,7 +176,8 @@ type TBranche = record position, // position actuelle : 1=dévié 2=droit Adrtriple, // 2eme adresse pour un aiguillage triple temps, // temps de pilotage (durée de l'impulsion en x 100 ms) - inversion : integer; // pilotage inversé 0=normal 1=inversé + inversion : integer; // pilotage inversé pour la commande (en mode sans CDM) 0=normal 1=inversé + InversionCDM : integer ; // inversion pour les aiguillages BIS en lecture (pour parer bug CDM) vitesse : integer; // vitesse de franchissement de l"aiguillage en position déviée (60 ou 90) ADroit : integer ; // (identifiant extérieur à la TJD) connecté sur la position droite en talon @@ -210,7 +210,8 @@ var ancien_tablo_signalCplx,EtatsignalCplx : array[0..MaxAcc] of word; AvecInitAiguillages,tempsCli,combine,NbreFeux,pasreponse,AdrDevie, NombreImages,signalCpx,branche_trouve,Indexbranche_trouve,Actuel,Signal_suivant, Nbre_recu_cdm,Tempo_chgt_feux,Adj1,Adj2,NbrePN : integer; - Hors_tension2,traceSign,TraceZone,Ferme,parSocket,ackCdm, + + Hors_tension2,traceSign,TraceZone,Ferme,parSocket,ackCdm,PremierFD, NackCDM,MsgSim,succes,recu_cv,AffActionneur,AffAigDet, TraceListe,clignotant,nack,Maj_feux_cours,configNulle : boolean; @@ -236,18 +237,18 @@ var entete,suffixe,ConfStCom : string; maxaiguillage,detecteur_chgt,Temps,TpsRecuCom,Tempo_init,Suivant,TypeGen, NbreImagePligne,NbreBranches,Index2_det,branche_det,Index_det, - I_simule,maxTablo_act,NbreVoies,AdresseFeuSuivant : integer; + I_simule,maxTablo_act,NbreVoies,AdresseFeuSuivant,El_suivant : integer; Ancien_detecteur,detecteur : array[0..1024] of boolean; // anciens état des détecteurs et adresses des détecteurs et leur état Adresse_detecteur : array[0..60] of integer; // adresses des détecteurs par index mem : array[0..1024] of boolean ; // mémoire des états des détecteurs MemZone : array[0..1024,0..1024] of boolean ; // mémoires de zones - Train : array[1..30] of record + (* Train : array[1..30] of record index : integer ; // nombre de routes pour ce train route : array[1..2000] of record Mem1,Mem2 : integer; end; end; - + *) Tablo_actionneur : array[1..100] of record actionneur,etat,fonction,tempo : integer; @@ -323,11 +324,11 @@ var // utilisation dans unité UnitPilote et configunit function Index_feu(adresse : integer) : integer; -procedure dessine_feu2(Acanvas : Tcanvas;EtatSignal : word); -procedure dessine_feu3(Acanvas : Tcanvas;EtatSignal : word); +procedure dessine_feu2(Acanvas : Tcanvas;x,y : integer;frX,frY : real;EtatSignal : word;orientation : integer); +procedure dessine_feu3(Acanvas : Tcanvas;x,y : integer;frX,frY : real;EtatSignal : word;orientation : integer); procedure dessine_feu4(Acanvas : Tcanvas;x,y : integer;frX,frY : real;EtatSignal : word;orientation : integer); -procedure dessine_feu5(Acanvas : Tcanvas;EtatSignal : word); -procedure dessine_feu7(Acanvas : Tcanvas;EtatSignal : word); +procedure dessine_feu5(Acanvas : Tcanvas;x,y : integer;frX,frY : real;EtatSignal : word;orientation : integer); +procedure dessine_feu7(Acanvas : Tcanvas;x,y : integer;frX,frY : real;EtatSignal : word;orientation : integer); procedure dessine_feu9(Acanvas : Tcanvas;x,y : integer;frX,frY : real;etatsignal : word;orientation : integer); procedure dessine_dir2(Acanvas : Tcanvas;EtatSignal : word); procedure dessine_dir3(Acanvas : Tcanvas;EtatSignal : word); @@ -341,7 +342,7 @@ procedure pilote_direction(Adr,nbre : integer); procedure connecte_USB; procedure deconnecte_usb; function IsWow64Process: Boolean; - +procedure Dessine_feu_mx(CanvasDest : Tcanvas;x,y : integer;FrX,frY : real;adresse : integer;orientation : integer); implementation @@ -400,33 +401,99 @@ begin end; // dessine les feux sur une cible à 2 feux -procedure dessine_feu2(Acanvas : Tcanvas;EtatSignal : word); -var code : integer; +procedure dessine_feu2(Acanvas : Tcanvas;x,y : integer;frX,frY : real;EtatSignal : word;orientation : integer); +var Temp,code,rayon,xViolet,YViolet,xBlanc,yBlanc, + LgImage,HtImage : integer; begin code:=code_to_aspect(Etatsignal); // et aspect + rayon:=round(6*frX); + + LgImage:=Formprinc.Image2feux.Picture.Bitmap.Width; + HtImage:=Formprinc.Image2feux.Picture.Bitmap.Height; + + XBlanc:=13; YBlanc:=11; + xViolet:=13; yViolet:=23; + + if (orientation=2) then + begin + //rotation 90° vers la gauche des feux + frX:=2*LargeurCell/HtImage; + frY:=HauteurCell/LgImage; + Temp:=HtImage-yViolet;YViolet:=XViolet;XViolet:=Temp; + Temp:=HtImage-yBlanc;YBlanc:=XBlanc;XBlanc:=Temp; + end; + + if (orientation=3) then + begin + //rotation 90° vers la droite des feux + // calcul des facteurs de réduction pour la rotation + frX:=2*LargeurCell/HtImage; + frY:=HauteurCell/LgImage; + Temp:=LgImage-XBlanc;Xblanc:=Yblanc;Yblanc:=Temp; + Temp:=LgImage-Xviolet;Xviolet:=Yviolet;Yviolet:=Temp; + end; + + XBlanc:=round(xBlanc*Frx)+x; YBlanc:=round(Yblanc*Fry)+Y; + XViolet:=round(XViolet*FrX)+x; YViolet:=round(YViolet*FrY)+Y; + // extinctions - if not((code=blanc_cli) and clignotant) then cercle(ACanvas,13,11,6,GrisF); - cercle(ACanvas,13,23,6,GrisF); + if not((code=blanc_cli) and clignotant) then cercle(ACanvas,xBlanc,yBlanc,rayon,GrisF); + cercle(ACanvas,xViolet,yViolet,rayon,GrisF); // allumages - if ((code=blanc_cli) and (clignotant)) or (code=blanc) then cercle(ACanvas,13,11,6,clWhite); - if code=violet then cercle(ACanvas,13,23,6,clviolet); + if ((code=blanc_cli) and (clignotant)) or (code=blanc) then cercle(ACanvas,xBlanc,yBlanc,rayon,clWhite); + if code=violet then cercle(ACanvas,xViolet,yViolet,rayon,clviolet); end; // dessine les feux sur une cible à 3 feux -procedure dessine_feu3(Acanvas : Tcanvas;EtatSignal : word); -var code : integer; +procedure dessine_feu3(Acanvas : Tcanvas;x,y : integer;frX,frY : real;EtatSignal : word;orientation : integer); +var Temp,code,rayon,xSem,Ysem,xJaune,Yjaune,Xvert,Yvert, + LgImage,HtImage : integer; begin code:=code_to_aspect(Etatsignal); // et aspect + rayon:=round(6*frX); + + LgImage:=Formprinc.Image3feux.Picture.Bitmap.Width; + HtImage:=Formprinc.Image3feux.Picture.Bitmap.Height; + + Xvert:=13; Yvert:=11; + xSem:=13; ySem:=22; + xJaune:=13; yJaune:=33; + + if (orientation=2) then + begin + //rotation 90° vers la gauche des feux + frX:=2*LargeurCell/HtImage; + frY:=HauteurCell/LgImage; + Temp:=HtImage-yjaune;YJaune:=XJaune;Xjaune:=Temp; + 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 + // calcul des facteurs de réduction pour la rotation + frX:=2*LargeurCell/HtImage; + frY:=HauteurCell/LgImage; + Temp:=LgImage-Xjaune;XJaune:=YJaune;Yjaune:=Temp; + Temp:=LgImage-XSem;XSem:=YSem;YSem:=Temp; + Temp:=LgImage-Xvert;Xvert:=Yvert;Yvert:=Temp; + end; + + XJaune:=round(Xjaune*Frx)+x; YJaune:=round(Yjaune*Fry)+Y; + Xvert:=round(Xvert*FrX)+x; Yvert:=round(Yvert*FrY)+Y; + XSem:=round(XSem*FrX)+x; YSem:=round(YSem*FrY)+Y; + // extinctions - if not((code=jaune_cli) and clignotant) then cercle(ACanvas,13,33,6,GrisF); - if not((code=vert_cli) and clignotant) then cercle(ACanvas,13,11,6,GrisF); - if not((code=semaphore_cli) and clignotant) then cercle(ACanvas,13,22,6,GrisF); + if not((code=jaune_cli) and clignotant) then cercle(ACanvas,xJaune,yJaune,rayon,GrisF); + if not((code=vert_cli) and clignotant) then cercle(ACanvas,xVert,yVert,rayon,GrisF); + if not((code=semaphore_cli) and clignotant) then cercle(ACanvas,xSem,ySem,rayon,GrisF); // allumages - if ((code=vert_cli) and (clignotant)) or (code=vert) then cercle(ACanvas,13,11,6,clGreen); - if ((code=jaune_cli) and (clignotant)) or (code=jaune) then cercle(Acanvas,13,33,6,clOrange); - if ((code=semaphore_cli) and (clignotant)) or (code=semaphore) then cercle(ACanvas,13,22,6,clRed); + if ((code=vert_cli) and (clignotant)) or (code=vert) then cercle(ACanvas,xVert,yVert,rayon,clGreen); + if ((code=jaune_cli) and (clignotant)) or (code=jaune) then cercle(Acanvas,xJaune,yJaune,rayon,clOrange); + if ((code=semaphore_cli) and (clignotant)) or (code=semaphore) then cercle(ACanvas,xSem,ySem,rayon,clRed); end; // dessine les feux sur une cible à 4 feux @@ -438,95 +505,207 @@ begin code:=code_to_aspect(Etatsignal); // et aspect rayon:=round(6*frX); - Xcarre:=round(13*frX); ycarre:=round(11*frY); - Xvert:=round(13*frX); Yvert:=round(22*frY); - xSem:=round(13*frX); ySem:=round(33*frY); - xJaune:=round(13*frX); yJaune:=round(44*frY); - - LgImage:=round(frx*Formprinc.Image9feux.Picture.Width); - HtImage:=round(fry*Formprinc.Image9feux.Picture.Height); + LgImage:=Formprinc.Image4feux.Picture.Bitmap.Width; + HtImage:=Formprinc.Image4feux.Picture.Bitmap.Height; + Xcarre:=13; ycarre:=11; + Xvert:=13; Yvert:=22; + xSem:=13; ySem:=33; + xJaune:=13; yJaune:=44; + if (orientation=2) then begin //rotation 90° vers la gauche des feux + frX:=2*LargeurCell/HtImage; + frY:=HauteurCell/LgImage; Temp:=HtImage-yjaune;YJaune:=XJaune;Xjaune:=Temp; Temp:=HtImage-ycarre;Ycarre:=Xcarre;Xcarre:=Temp; 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 + // calcul des facteurs de réduction pour la rotation + frX:=2*LargeurCell/HtImage; + frY:=HauteurCell/LgImage; + Temp:=LgImage-Xjaune;XJaune:=YJaune;Yjaune:=Temp; + Temp:=LgImage-XSem;XSem:=YSem;YSem:=Temp; + Temp:=LgImage-Xvert;Xvert:=Yvert;Yvert:=Temp; + Temp:=LgImage-Xcarre;Xcarre:=Ycarre;Ycarre:=Temp; + end; + + XJaune:=round(Xjaune*Frx)+x; YJaune:=round(Yjaune*Fry)+Y; + Xvert:=round(Xvert*FrX)+x; Yvert:=round(Yvert*FrY)+Y; + XSem:=round(XSem*FrX)+x; YSem:=round(YSem*FrY)+Y; + Xcarre:=round(Xcarre*FrX)+x; Ycarre:=round(Ycarre*FrY)+Y; + //extinctions -// cercle(ACanvas,x+round(13*frX),y+round(11*frY),rayon,GrisF); - if not((code=semaphore_cli) and clignotant) then cercle(ACanvas,x+Xsem,y+round(y+Ysem),rayon,GrisF); - if not((code=vert_cli) and clignotant) then cercle(ACanvas,x+Xvert,y+yvert,rayon,GrisF); - if not((code=jaune_cli) and clignotant) then cercle(ACanvas,x+Xjaune,y+YJaune,rayon,GrisF); + cercle(ACanvas,Xcarre,yCarre,rayon,GrisF); + if not((code=semaphore_cli) and clignotant) then cercle(ACanvas,Xsem,Ysem,rayon,GrisF); + if not((code=vert_cli) and clignotant) then cercle(ACanvas,Xvert,yvert,rayon,GrisF); + if not((code=jaune_cli) and clignotant) then cercle(ACanvas,Xjaune,YJaune,rayon,GrisF); // allumages - if ((code=vert_cli) and (clignotant)) or (code=vert) then cercle(ACanvas,x+xVert,y+yVert,rayon,clGreen); - if ((code=jaune_cli) and (clignotant)) or (code=jaune) then cercle(Acanvas,x+Xjaune,y+yJaune,rayon,clOrange); - if ((code=semaphore_cli) and (clignotant)) or (code=semaphore) then cercle(ACanvas,x+xSem,y+ySem,rayon,clRed); + if ((code=vert_cli) and (clignotant)) or (code=vert) then cercle(ACanvas,xVert,yVert,rayon,clGreen); + if ((code=jaune_cli) and (clignotant)) or (code=jaune) then cercle(Acanvas,Xjaune,yJaune,rayon,clOrange); + if ((code=semaphore_cli) and (clignotant)) or (code=semaphore) then cercle(ACanvas,xSem,ySem,rayon,clRed); if code=carre then begin - cercle(ACanvas,x+xSem,y+Ysem,rayon,clRed); - cercle(ACanvas,x+xCarre,y+yCarre,rayon,clRed); + cercle(ACanvas,xSem,Ysem,rayon,clRed); + cercle(ACanvas,xCarre,yCarre,rayon,clRed); end; end; // dessine les feux sur une cible à 5 feux -procedure dessine_feu5(Acanvas : Tcanvas;EtatSignal : word); -var code : integer; +procedure dessine_feu5(Acanvas : Tcanvas;x,y : integer;frX,frY : real;EtatSignal : word;orientation : integer); +var code, XBlanc,Yblanc,xJaune,yJaune,Xsem,YSem,Xvert,YVert,Xcarre,Ycarre, + Temp,rayon,LgImage,HtImage : integer; begin code:=code_to_aspect(Etatsignal); // et aspect + rayon:=round(6*frX); + XBlanc:=13; YBlanc:=22; + xJaune:=13; yJaune:=55; + Xcarre:=13; Ycarre:=11; + XSem:=13; Ysem:=44; + XVert:=13; YVert:=33; + + LgImage:=Formprinc.Image5feux.Picture.Bitmap.Width; + HtImage:=Formprinc.Image5feux.Picture.Bitmap.Height; + + if (orientation=2) then + begin + //rotation 90° vers la gauche des feux + // calcul des facteurs de réduction pour la rotation + frX:=2*LargeurCell/HtImage; + frY:=HauteurCell/LgImage; + Temp:=HtImage-yjaune;YJaune:=XJaune;Xjaune:=Temp; + Temp:=HtImage-yBlanc;YBlanc:=XBlanc;XBlanc:=Temp; + Temp:=HtImage-ycarre;Ycarre:=Xcarre;Xcarre:=Temp; + 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 + // calcul des facteurs de réduction pour la rotation + frX:=2*LargeurCell/HtImage; + frY:=HauteurCell/LgImage; + Temp:=LgImage-Xjaune;XJaune:=YJaune;Yjaune:=Temp; + Temp:=LgImage-XSem;XSem:=YSem;YSem:=Temp; + Temp:=LgImage-Xvert;Xvert:=Yvert;Yvert:=Temp; + Temp:=LgImage-Xcarre;Xcarre:=Ycarre;Ycarre:=Temp; + Temp:=LgImage-Xblanc;Xblanc:=Yblanc;Yblanc:=Temp; + end; + + XJaune:=round(Xjaune*Frx)+x; YJaune:=round(Yjaune*Fry)+Y; + Xblanc:=round(XBlanc*FrX)+x; YBlanc:=round(YBlanc*FrY)+Y; + Xvert:=round(Xvert*FrX)+x; Yvert:=round(Yvert*FrY)+Y; + XSem:=round(XSem*FrX)+x; YSem:=round(YSem*FrY)+Y; + Xcarre:=round(Xcarre*FrX)+x; Ycarre:=round(Ycarre*FrY)+Y; + // extinctions - if not((code=blanc_cli) and clignotant) then cercle(ACanvas,13,22,6,GrisF); - cercle(ACanvas,13,11,6,GrisF); - if not((code=vert_cli) and clignotant) then cercle(ACanvas,13,33,6,GrisF); - if not((code=semaphore_cli) and clignotant) then cercle(ACanvas,13,44,6,GrisF); - if not((code=jaune_cli) and clignotant) then cercle(ACanvas,13,55,6,GrisF); + if not((code=blanc_cli) and clignotant) then cercle(ACanvas,xBlanc,yBlanc,rayon,GrisF); + cercle(ACanvas,xcarre,ycarre,rayon,GrisF); + if not((code=vert_cli) and clignotant) then cercle(ACanvas,xvert,yvert,rayon,GrisF); + if not((code=semaphore_cli) and clignotant) then cercle(ACanvas,xSem,ySem,rayon,GrisF); + if not((code=jaune_cli) and clignotant) then cercle(ACanvas,xjaune,yjaune,rayon,GrisF); //allumages - if ((code=semaphore_cli) and (clignotant)) or (code=semaphore) then cercle(ACanvas,13,44,6,clRed); - if ((code=blanc_cli) and (clignotant)) or (code=blanc) then cercle(ACanvas,13,22,6,clWhite); + if ((code=semaphore_cli) and (clignotant)) or (code=semaphore) then cercle(ACanvas,xsem,ysem,rayon,clRed); + if ((code=blanc_cli) and (clignotant)) or (code=blanc) then cercle(ACanvas,xblanc,yblanc,rayon,clWhite); if code=carre then begin - cercle(ACanvas,13,44,6,clRed); - cercle(ACanvas,13,11,6,clRed); + cercle(ACanvas,xcarre,ycarre,rayon,clRed); + cercle(ACanvas,xsem,ysem,rayon,clRed); end; - if ((code=vert_cli) and (clignotant)) or (code=vert) then cercle(ACanvas,13,33,6,clGreen); - if ((code=jaune_cli) and (clignotant)) or (code=jaune) then cercle(ACanvas,13,55,6,clorange); + if ((code=vert_cli) and (clignotant)) or (code=vert) then cercle(ACanvas,xvert,yVert,rayon,clGreen); + if ((code=jaune_cli) and (clignotant)) or (code=jaune) then cercle(ACanvas,xJaune,yjaune,rayon,clorange); end; // dessine les feux sur une cible à 7 feux -procedure dessine_feu7(Acanvas : Tcanvas;EtatSignal : word); -var code : integer; +procedure dessine_feu7(Acanvas : Tcanvas;x,y : integer;frX,frY : real;EtatSignal : word;orientation : integer); +var code, XBlanc,Yblanc,xJaune,yJaune,Xsem,YSem,Xvert,YVert,Xcarre,Ycarre,Xral1,Yral1,Xral2,YRal2, + Temp,rayon,LgImage,HtImage : integer; begin code:=code_to_aspect(Etatsignal); // et combine - // effacements + rayon:=round(6*frX); + XBlanc:=13; YBlanc:=23; + Xral1:=13; YRal1:=11; + Xral2:=37; YRal2:=11; + xJaune:=13; yJaune:=66; + Xcarre:=13; Ycarre:=35; + XSem:=13; Ysem:=56; + XVert:=13; YVert:=45; - if not((code=blanc_cli) and clignotant) then cercle(ACanvas,13,23,6,grisF); + LgImage:=Formprinc.Image7feux.Picture.Bitmap.Width; + HtImage:=Formprinc.Image7feux.Picture.Bitmap.Height; + + if (orientation=2) then + begin + //rotation 90° vers la gauche des feux + // calcul des facteurs de réduction pour la rotation + frX:=2*LargeurCell/HtImage; + frY:=HauteurCell/LgImage; + Temp:=HtImage-yjaune;YJaune:=XJaune;Xjaune:=Temp; + Temp:=HtImage-yBlanc;YBlanc:=XBlanc;XBlanc:=Temp; + Temp:=HtImage-yRal1;YRal1:=XRal1;XRal1:=Temp; + Temp:=HtImage-yRal2;YRal2:=XRal2;XRal2:=Temp; + Temp:=HtImage-ycarre;Ycarre:=Xcarre;Xcarre:=Temp; + 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 + // calcul des facteurs de réduction pour la rotation + frX:=2*LargeurCell/HtImage; + frY:=HauteurCell/LgImage; + Temp:=LgImage-Xjaune;XJaune:=YJaune;Yjaune:=Temp; + Temp:=LgImage-XSem;XSem:=YSem;YSem:=Temp; + Temp:=LgImage-Xvert;Xvert:=Yvert;Yvert:=Temp; + Temp:=LgImage-Xcarre;Xcarre:=Ycarre;Ycarre:=Temp; + Temp:=LgImage-Xblanc;Xblanc:=Yblanc;Yblanc:=Temp; + Temp:=LgImage-Xral1;Xral1:=Yral1;Yral1:=Temp; + Temp:=LgImage-Xral2;Xral2:=Yral2;Yral2:=Temp; + end; + + XJaune:=round(Xjaune*Frx)+x; YJaune:=round(Yjaune*Fry)+Y; + Xblanc:=round(XBlanc*FrX)+x; YBlanc:=round(YBlanc*FrY)+Y; + XRal1:=round(XRal1*FrX)+x; YRal1:=round(YRal1*FrY)+Y; + XRal2:=round(XRal2*FrX)+x; YRal2:=round(YRal2*FrY)+Y; + Xvert:=round(Xvert*FrX)+x; Yvert:=round(Yvert*FrY)+Y; + XSem:=round(XSem*FrX)+x; YSem:=round(YSem*FrY)+Y; + Xcarre:=round(Xcarre*FrX)+x; Ycarre:=round(Ycarre*FrY)+Y; + + // effacements + if not((code=blanc_cli) and clignotant) then cercle(ACanvas,xBlanc,yBlanc,rayon,grisF); if not((code=ral_60) and clignotant) or not((combine=ral_60) and clignotant) then begin - cercle(ACanvas,13,11,6,grisF);cercle(ACanvas,37,11,6,GrisF); + cercle(ACanvas,Xral1,Yral1,rayon,grisF);cercle(ACanvas,Xral2,Yral2,rayon,GrisF); end; - if not((code=vert_cli) and clignotant) then cercle(ACanvas,13,45,6,GrisF); - cercle(ACanvas,13,35,6,GrisF);cercle(ACanvas,13,55,6,GrisF); - if not((code=jaune_cli) and clignotant) then cercle(ACanvas,13,66,6,GrisF); - if not((code=semaphore_cli) and clignotant) then cercle(ACanvas,13,56,6,GrisF); + if not((code=vert_cli) and clignotant) then cercle(ACanvas,xVert,yVert,rayon,GrisF); + cercle(ACanvas,xcarre,yCarre,rayon,GrisF);cercle(ACanvas,xSem,ySem,rayon,GrisF); + if not((code=jaune_cli) and clignotant) then cercle(ACanvas,xJaune,yJaune,rayon,GrisF); + if not((code=semaphore_cli) and clignotant) then cercle(ACanvas,xSem,ySem,rayon,GrisF); // Allumages if (code=ral_30) or (combine=ral_30) or ((code=ral_60) or (combine=ral_60)) and clignotant then begin - cercle(ACanvas,13,11,6,clOrange);cercle(ACanvas,37,11,6,clOrange); + cercle(ACanvas,xRal1,yRal1,rayon,clOrange);cercle(ACanvas,xRal2,yRal2,Rayon,clOrange); end; - if (code=jaune) or ((code=jaune_cli) and clignotant) then cercle(Acanvas,13,66,6,clOrange); - if ((code=semaphore_cli) and (clignotant)) or (code=semaphore) then cercle(ACanvas,13,56,6,clRed); - if ((code=vert_cli) and (clignotant)) or (code=vert) then cercle(ACanvas,13,45,6,clGreen); - if ((code=blanc_cli) and (clignotant)) or (code=blanc) then cercle(ACanvas,13,23,6,clWhite); + if (code=jaune) or ((code=jaune_cli) and clignotant) then cercle(Acanvas,xjaune,yjaune,rayon,clOrange); + if ((code=semaphore_cli) and (clignotant)) or (code=semaphore) then cercle(ACanvas,xsem,ysem,rayon,clRed); + if ((code=vert_cli) and (clignotant)) or (code=vert) then cercle(ACanvas,xVert,yVert,rayon,clGreen); + if ((code=blanc_cli) and (clignotant)) or (code=blanc) then cercle(ACanvas,xBlanc,yBlanc,rayon,clWhite); if code=carre then begin - cercle(ACanvas,13,35,6,clRed); - cercle(ACanvas,13,55,6,clRed); + cercle(ACanvas,xCarre,yCarre,rayon,clRed); + cercle(ACanvas,xSem,ySem,rayon,clRed); end; end; @@ -536,19 +715,11 @@ var code,rayon, XBlanc,Yblanc,xJaune,yJaune,Xsem,YSem,Xvert,YVert,Xcarre,Ycarre,Xral1,Yral1,Xral2,YRal2, Xrap1,Yrap1,Xrap2,Yrap2,Temp : integer; LgImage,HtImage,xt,yt : integer; - TempF : double; begin rayon:=round(6*frX); code:=code_to_aspect(Etatsignal); // et aspect -// Affiche('Dessine feu9 FrX='+FloatToSTR(frx)+' FrY='+FloatToSTR(fry)+' orientation='+IntToSTr(orientation),clorange); // mise à l'échelle des coordonnées des feux en fonction du facteur de réduction frX et frY et x et y (offsets) -// Temp:=HtImage-y;Y:=X;X:=Temp; -// x:=round(frx*x);y:=round(fry*y); - if orientation=2 then begin -// TempF:=frX;frX:=frY;frY:=TempF; - end; - XBlanc:=13; YBlanc:=36; Xral1:=13; YRal1:=24; Xral2:=37; YRal2:=24; @@ -559,10 +730,6 @@ begin XSem:=13; Ysem:=69; XVert:=13; YVert:=58; - Acanvas.MoveTo(0,0);ACanvas.LineTo(1,1); - - - LgImage:=Formprinc.Image9feux.Picture.Bitmap.Width; HtImage:=Formprinc.Image9feux.Picture.Bitmap.Height; @@ -586,7 +753,6 @@ begin if (orientation=3) then begin //rotation 90° vers la droite des feux - //rotation 90° vers la gauche des feux // calcul des facteurs de réduction pour la rotation frX:=2*LargeurCell/HtImage; frY:=HauteurCell/LgImage; @@ -636,7 +802,7 @@ begin if ((code=rappel_60) and clignotant) or (code=rappel_30) or ((combine=rappel_60) and clignotant) or (combine=rappel_30) then begin - cercle(ACanvas,xrap1,yrap2,rayon,clOrange);cercle(ACanvas,xrap2,yrap2,rayon,clOrange); + cercle(ACanvas,xrap1,yrap1,rayon,clOrange);cercle(ACanvas,xrap2,yrap2,rayon,clOrange); end; if ((code=jaune_cli) and clignotant) or (code=jaune) then cercle(Acanvas,xjaune,yjaune,rayon,clOrange); if ((code=semaphore_cli) and clignotant) or (code=semaphore) then cercle(ACanvas,Xsem,ySem,rayon,clRed); @@ -899,19 +1065,42 @@ i:=1; if trouve then Index_feu:=i else Index_feu:=0 ; end; -// dessine l'aspect du feu en fonction de son adresse -procedure Dessine_feu(adresse : integer); +// dessine l'aspect du feu en fonction de son adresse dans la partie droite de droite +procedure Dessine_feu_mx(CanvasDest : Tcanvas;x,y : integer;FrX,frY : real;adresse : integer;orientation : integer); var i : integer; begin i:=Index_feu(adresse); if i<>0 then case feux[i].aspect of // feux de signalisation - 2 : dessine_feu2(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); - 3 : dessine_feu3(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); + 2 : dessine_feu2(CanvasDest,x,y,frx,fry,EtatSignalCplx[adresse],orientation); + 3 : dessine_feu3(CanvasDest,x,y,frx,fry,EtatSignalCplx[adresse],orientation); + 4 : dessine_feu4(CanvasDest,x,y,frx,fry,EtatSignalCplx[adresse],orientation); + 5 : dessine_feu5(CanvasDest,x,y,frx,fry,EtatSignalCplx[adresse],orientation); + 7 : dessine_feu7(CanvasDest,x,y,frx,fry,EtatSignalCplx[adresse],orientation); + 9 : dessine_feu9(CanvasDest,x,y,frx,fry,EtatSignalCplx[adresse],orientation); + // indicateurs de direction + 12 : dessine_dir2(CanvasDest,EtatSignalCplx[adresse]); + 13 : dessine_dir3(CanvasDest,EtatSignalCplx[adresse]); + 14 : dessine_dir4(CanvasDest,EtatSignalCplx[adresse]); + 15 : dessine_dir5(CanvasDest,EtatSignalCplx[adresse]); + 16 : dessine_dir6(CanvasDest,EtatSignalCplx[adresse]); + end; +end; + +// dessine l'aspect du feu en fonction de son adresse dans la partie droite de droite +procedure Dessine_feuxx(adresse : integer); +var i : integer; +begin + i:=Index_feu(adresse); + if i<>0 then + case feux[i].aspect of + // feux de signalisation + 2 : dessine_feu2(Feux[i].Img.Canvas,0,0,1,1,EtatSignalCplx[adresse],1); + 3 : dessine_feu3(Feux[i].Img.Canvas,0,0,1,1,EtatSignalCplx[adresse],1); 4 : dessine_feu4(Feux[i].Img.Canvas,0,0,1,1,EtatSignalCplx[adresse],1); - 5 : dessine_feu5(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); - 7 : dessine_feu7(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); + 5 : dessine_feu5(Feux[i].Img.Canvas,0,0,1,1,EtatSignalCplx[adresse],1); + 7 : dessine_feu7(Feux[i].Img.Canvas,0,0,1,1,EtatSignalCplx[adresse],1); 9 : dessine_feu9(Feux[i].Img.Canvas,0,0,1,1,EtatSignalCplx[adresse],1); // indicateurs de direction 12 : dessine_dir2(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); @@ -1009,13 +1198,14 @@ begin 15 : picture.bitmap:=Formprinc.Image5Dir.picture.Bitmap; 16 : picture.bitmap:=Formprinc.Image6Dir.picture.Bitmap; end; + // mettre rouge par défaut if TypeFeu=2 then EtatSignalCplx[feux[rang].adresse]:=violet_F; if TypeFeu=3 then EtatSignalCplx[feux[rang].adresse]:=semaphore_F; if (TypeFeu>3) and (TypeFeu<10) then EtatSignalCplx[feux[rang].adresse]:=carre_F; if TypeFeu>10 then EtatSignalCplx[feux[rang].adresse]:=0; - dessine_feu(feux[rang].adresse); + dessine_feu_mx(Feux[rang].Img.Canvas,0,0,1,1,feux[rang].adresse,1); //if feux[rang].aspect=5 then cercle(Picture.Bitmap.Canvas,13,22,6,ClYellow); end; @@ -1439,6 +1629,7 @@ sur un panneau directionnel - adresse : adresse du signal - code de 1 ; le panneau directionnel à 1, 2 ou 3 leds. ============================================== } procedure envoi_directionBahn(adr : integer;code : integer); +var i : integer; begin if (EtatSignalCplx[adr]<>code) then begin @@ -1476,7 +1667,7 @@ begin end; end; EtatSignalCplx[adr]:=code; - Dessine_feu(adr); + Dessine_feu_mx(Feux[Index_Feu(adr)].Img.Canvas,0,0,1,1,adr,1); end; end; @@ -1565,7 +1756,7 @@ begin // signalisation combinée - rappel 30 + avertissement - à tester...... if (Combine=0) then pilote_acc(adresse+2,1,feu) ; // éteindre rappel 30 if (Combine=rappel_30) then pilote_acc(adresse+2,2,feu) ; // allumer rappel 30 - dessine_feu(adresse); + Dessine_feu_mx(Feux[Index_Feu(adresse)].Img.Canvas,0,0,1,1,adresse,1); end; end; @@ -1643,7 +1834,7 @@ begin if ((Combine=rappel_60) and (aspect=jaune)) then envoi5_LEB($10); if ((Combine=rappel_60) and (aspect=jaune_cli)) then envoi5_LEB($11); if ((Combine=ral_60) and (aspect=jaune_cli)) then envoi5_LEB($12); - dessine_feu(adr); + Dessine_feu_mx(Feux[Index_Feu(adr)].Img.Canvas,0,0,1,1,adr,1); end; end; @@ -1730,7 +1921,7 @@ begin if (Combine=rappel_60) and (aspect=jaune_cli) then valeur:=18; pilote_acc(adresse,valeur,feu); - dessine_feu(adresse); + Dessine_feu_mx(Feux[Index_Feu(adresse)].Img.Canvas,0,0,1,1,adresse,1); end; end; @@ -2028,7 +2219,7 @@ begin end; if (code=jaune) and (combine=rappel_60) then pilote_acc(adresse+3,1,feu); end; - dessine_feu(adresse); + Dessine_feu_mx(Feux[Index_Feu(adresse)].Img.Canvas,0,0,1,1,adresse,1); end; end; @@ -2086,7 +2277,7 @@ begin if (aspect=rappel_60) then begin pilote_acc(adr+3,2,feu);sleep(tempoFeu);pilote_acc(adr+1,2,feu);end; end; end; - dessine_feu(adr); + Dessine_feu_mx(Feux[Index_Feu(adr)].Img.Canvas,0,0,1,1,adr,1); end; end; @@ -2102,7 +2293,7 @@ begin aspect:=code_to_aspect(code); // transforme le motif de bits en numéro "code des aspects des signaux" if (tracesign) then Affiche('Signal virtuel: ad'+intToSTR(adresse)+'='+etatSign[aspect],clOrange); if AffSignal then AfficheDebug('Signal virtuel: ad'+intToSTR(adresse)+'='+etatSign[aspect],clOrange); - dessine_feu(adresse); + Dessine_feu_mx(Feux[Index_Feu(adresse)].Img.Canvas,0,0,1,1,adresse,1); end; end; @@ -2174,7 +2365,7 @@ begin sleep(40); pilote_ACC(adresse+CombineLoc,2,feu) ; end; - dessine_feu(adresse); + Dessine_feu_mx(Feux[Index_Feu(adresse)].Img.Canvas,0,0,1,1,adresse,1); end; end; @@ -3158,10 +3349,11 @@ begin // initialisation des aiguillages avec des valeurs par défaut for i:=1 to MaxAcc do begin - Aiguillage[i].modele:=0 ;// sans existence - Aiguillage[i].position:=2; //droit + Aiguillage[i].modele:=0 ; // sans existence + Aiguillage[i].position:=9; // position inconnue Aiguillage[i].temps:=5 ; Aiguillage[i].inversion:=0; + Aiguillage[i].inversionCDM:=0; Aiguillage[i].objet:=0; end; for i:=1 to 1024 do @@ -3249,13 +3441,13 @@ begin aiguillageB[adresse].position:=position; // temporisation aiguillage - j:=pos(',',s); - temporisation:=StrToInt(copy(s,1,j-1));Delete(S,1,j); + j:=pos(',',s);if j=0 then j:=length(s); + val(s,temporisation,erreur);Delete(S,1,j); if (temporisation<0) or (temporisation>10) then temporisation:=5; aiguillage[adresse].temps:=temporisation; aiguillageB[adresse].temps:=temporisation; - invers:=StrToInt(s); + val(s,invers,erreur); if (invers<0) or (invers>1) then invers:=0; // inversion commande aiguillage[adresse].inversion:=invers; aiguillageB[adresse].inversion:=invers; @@ -3438,11 +3630,28 @@ begin delete(s,1,virgule); end; + // si vitesse définie Val(enregistrement,adr,erreur); if erreur=0 then begin aiguillage[aig].vitesse:=adr; enregistrement:=''; + virgule:=pos(',',s);if virgule=0 then virgule:=length(s)+1; + enregistrement:=copy(s,1,virgule-1); + delete(s,1,virgule); + end; + + // si inversion aiguillage BIS pour parer à bug CDM aiguillage + Val(enregistrement,adr,erreur); + if erreur=0 then + begin + if bis=0 then + begin + Affiche('Avertissement: le paramètre de lecture inversée de la position pour l''aiguillage non bis '+intToSTR(aig)+' sera ignorée',clOrange); + end; + if bis=1 then aiguillageB[aig].inversionCDM:=adr; + + enregistrement:=''; end; until enregistrement='' ; @@ -3960,7 +4169,7 @@ begin AfficheDebug(s,clred); Suivant_alg3:=9999;exit; end; - if NivDebug=3 then AfficheDebug('Alg3 précedent='+intToSTR(prec)+'/'+intToStr(TypeElprec)+' actuel='+intToSTR(actuel)+'/'+IntToSTR(typeElActuel),clyellow); + if NivDebug=3 then AfficheDebug('Alg3 précédent='+intToSTR(prec)+'/'+intToStr(TypeElprec)+' actuel='+intToSTR(actuel)+'/'+IntToSTR(typeElActuel),clyellow); // trouver les éléments du précédent trouve_element(prec,TypeELPrec); // branche_trouve IndexBranche_trouve if IndexBranche_trouve=0 then @@ -4606,6 +4815,8 @@ end; // renvoie l'adresse du détecteur suivant des deux éléments // El1 et El2 peuvent être séparés par des aiguillages +// en sortie : 1= det1 non trouvé 2= det2 non trouvé +// code erreur>=9997 ou 0 function detecteur_suivant_El(el1: integer;TypeDet1 : integer;el2 : integer;TypeDet2 : integer) : integer ; var IndexBranche_det1,IndexBranche_det2,branche_trouve_det1,branche_trouve_det2,i, j,AdrPrec,Adr,AdrFonc,Btype,BisPrec,BisFonc,BisSuiv : integer; @@ -4614,7 +4825,11 @@ var IndexBranche_det1,IndexBranche_det2,branche_trouve_det1,branche_trouve_det2, begin if NivDebug>=2 then AfficheDebug('cherche détecteur_suivant_El aux '+IntToSTR(el1)+'/'+intToSTR(TypeDet1)+'-'+intToSTR(el2)+'/'+intToSTr(TypeDet2),clyellow); - // traceDet=TRUE; +// if (El1=553) and (el2=521) then +// begin +// TraceListe:=true; +// NivDebug:=3; +// end; // trouver détecteur 1 trouve_element(el1,Typedet1); // branche_trouve IndexBranche_trouve if (IndexBranche_trouve=0) then @@ -4660,7 +4875,7 @@ begin repeat Adr:=suivant_alg3(AdrPrec,BisPrec,AdrFonc,BisFonc,1); // donne l'élément suivant de AdrPrec à AdrFonc et dans Bis si c'est un aig bis if (Adr>=9997) then begin detecteur_suivant_el:=Adr;exit;end; - if (NivDebug=3) then AfficheDebug('trouvé '+intToSTR(Adr)+' '+intToSTR(typeGen),clorange); + if (NivDebug=3) then AfficheDebug('trouvé='+intToSTR(Adr)+' type='+intToSTR(typeGen),clorange); trouve_element(Adr,typeGen); Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; BisSuiv:=Btype; // si aiguillage bis @@ -5041,7 +5256,6 @@ var begin if NivDebug>=1 then AfficheDebug('Proc test_memoire_zones - Cherche mémoire à 1 du signal '+intToSTR(adresse)+' au signal suivant ',clyellow); - i:=Index_feu(adresse); if (i=0) then begin @@ -5094,8 +5308,9 @@ begin TypePrec:=1; if (prec=0) then begin - test_memoire_zones:=Pres_train; - exit; + // sortie si aucun détecteur déclaré sur le feu + test_memoire_zones:=Pres_train; + exit; end; PrecInitial:=Prec; @@ -5131,7 +5346,7 @@ begin 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('mémoire de zone '+IntToSTR(PrecInitial)+' à '+intToSTR(actuel)+'='+IntToSTR(PresTrain01),clyellow); + if NivDebug=3 then AfficheDebug('de '+IntToSTR(PrecInitial)+' à '+intToSTR(actuel)+'='+IntToSTR(PresTrain01),clyellow); // prec:=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 @@ -5144,9 +5359,10 @@ begin begin if (feux[i].Adr_el_suiv1<>prec) then // le feu est-il dans le bon sens de progression? begin - if (NivDebug=3) And Pres_Train then AfficheDebug('Mémoire de zone à 1',clyellow); - if (NivDebug=3) And (not(Pres_Train)) then AfficheDebug('Mémoire de zone à 0',clyellow); + if (NivDebug=3) And Pres_Train then AfficheDebug('Sortie proced:Mémoire de zone à 1',clyellow); + if (NivDebug=3) And (not(Pres_Train)) then AfficheDebug('Sortie proced:Mémoire de zone à 0',clyellow); test_memoire_zones:=Pres_train;exit; + end else begin @@ -5169,26 +5385,9 @@ begin inc(ife); until ife>=5; if (NivDebug=3) and (Etat=0) then AfficheDebug('Pas trouvé de signal suivant au '+intToSTR(adresse),clyellow); - test_memoire_zones:=Pres_train; end; -// trouve une séquence chronologique 010 sur un détecteur -function trouve_seq_chrono_010(Adresse : integer) : boolean; -var i,etat : integer; - etat0_seq1,etat1_seq2,etat0_seq3 : boolean; -begin - i:=N_Event_tick; - if i<2 then exit; - Affiche('test si seq 010 sur det '+intToSTR(Adresse),clyellow); - etat0_seq1:=false; etat1_seq2:=false; etat0_seq3:=false; - if (event_det_tick[i].detecteur=0) then begin etat0_seq1:=true;end; - repeat - if (event_det_tick[i].detecteur=1) and etat0_seq1 then begin etat1_seq2:=true;end; - dec(i); // remonter le temps ... - until (i=0) or (etat1_seq2); - trouve_seq_chrono_010:=etat1_seq2; -end; Procedure affiche_Event_det; var i : integer; @@ -5219,7 +5418,12 @@ function trouve_index_det_chrono(Adr,etat,index : integer) : integer; var i : integer; trouve : boolean; begin - if index<=0 then begin affiche('Erreur 784 index invalide',clred);exit; end; + if index<=0 then + begin + affiche('Erreur 784 index détecteur invalide',clred); + AfficheDebug('Erreur 784 index détecteur invalide',clred); + exit; + end; i:=index; if i>N_Event_tick then begin trouve_index_det_chrono:=0;exit; end; inc(i); @@ -5234,236 +5438,33 @@ begin trouve_index_det_chrono:=0; end; - -// calcul des zones depuis le tableau des fronts descendants des évènements détecteurs +// teste si la route est valide de det1, det2 à det3 // les détecteurs doivent être consécutifs // 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 // Variable globale: El_suivant : adresse du détecteur suivant le détecteur "actuel" -// Actuel,Suivant : nouveaux détecteurs du canton suivant // Résultat: // si 0 : pas de route // si 1 : détecteur det1 non trouvé // si 2 : détecteur det2 non trouvé // si 3 : erreur fatale // si 10 : ok route trouvée - -function calcul_zones_det(det1,det2 : integer) : integer; -var - i,i1,i2,j,k,IndexBranche_det1,IndexBranche_det2,index_i1,index_i2, - branche_trouve_det1,branche_trouve_det2,Adr,AdrPrec,position,Btype,BTypePrec, - AdrFonc,TypePrec,TypeSuiv,TypeFonc,AdrSuiv,Train_Courant : integer; - t,sortie,trouve : boolean; - s,ss : string; - +function test_route_valide(det1,det2,det3 : integer) : integer; +var det_suiv,resultat : integer; begin - // if trouve_seq_chrono_010(det1) then Affiche('trouvé séquence 010 sur détecteur '+intToSTR(det1),clyellow); - // if trouve_seq_chrono_010(det2) then Affiche('trouvé séquence 010 sur détecteur '+intToSTR(det2),clyellow); - if traceListe then AfficheDebug('calcul_zones_det('+intToSTR(det1)+','+intToSTR(det2)+')',clyellow); - // trouver détecteur 1 - trouve_detecteur(det1); // branche_trouve IndexBranche_trouve - if (IndexBranche_trouve=0) then + det_suiv:=detecteur_suivant_el(det1,1,det2,1); + if (det_suiv<=2) or (det_suiv>=9997) or (det3<>det_suiv) then begin resultat:=0;end; + // test sens inverse.... + if resultat=0 then begin - Affiche('détecteur '+IntToSTR(det1)+' non trouvé',clred); - calcul_zones_det:=1;exit; + test_route_valide:=0;exit; + // si manipulation proche aiguillage + det_suiv:=detecteur_suivant_el(det3,1,det2,1); + if (det_suiv<=2) or (det_suiv>=9997) or (det1<>det_suiv) then begin test_route_valide:=0;exit;end; end; - IndexBranche_det1:=IndexBranche_trouve; - branche_trouve_det1:=branche_trouve; - - // trouver détecteur 2 - trouve_detecteur(det2); // branche_trouve IndexBranche_trouve - if (IndexBranche_trouve=0) then - begin - Affiche('détecteur '+IntToSTR(det2)+' non trouvé',clred); - calcul_zones_det:=2;exit; - end; - - IndexBranche_det2:=IndexBranche_trouve; - branche_trouve_det2:=branche_trouve; - - j:=1; - // étape 1 : trouver le sens de progression (en incrément ou en décrément) - repeat // boucle d'incrément décrément - if (traceListe) then - begin - s:='Test 2 route en '; - if (j=1) then s:=s+'décrément ' else s:=s+'incrément '; - s:=s+'- départ depuis détecteur '+IntToSTR(det1); - AfficheDebug(s,clyellow); - end; - AdrPrec:=det1; - TypePrec:=1; - if (j=1) then i:=IndexBranche_det1-1 else i:=IndexBranche_det1+1; - //trouve_element(det1,FALSE); - Adr:=BrancheN[branche_trouve_det1,i].Adresse; - AdrFonc:=Adr; - Btype:=BrancheN[branche_trouve_det1,i].BType; // élément suivant/précédent - TypeFonc:=Btype; - - // si l'élément suivant est un détecteur et il est différent de det2, c'est pas le bon sens : inutile de traiter le cas - if (Btype<>1) or (Adr=Det2) then - begin - i:=0; - if (det2<>Adr) then - repeat - Adr:=suivant_alg3(AdrPrec,TypePrec,AdrFonc,TypeFonc,1); // donne l'élément suivant de AdrPrec à AdrFonc et dans Bis si c'est un aig bis - trouve_element(Adr,typeGen); - Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; - TypeSuiv:=Btype; // si aiguillage bis - //Affiche(intToSTR(adr)+'/'+intToStr(Btype),clorange); - AdrPrec:=AdrFonc;AdrFonc:=Adr; - TypePrec:=TypeFonc;TypeFonc:=typeGen; - i:=i+1; - sortie:=(Btype=1) or (Btype=4) or (i=20) or (Adr=0); - until (sortie) ; // boucle de parcours - end; - - if (i=20) then - begin Affiche('Erreur fatale 200 : Itération trop longue',clred); - AfficheDebug('Erreur fatale 200 : Itération trop longue',clred);calcul_zones_det:=3; - end; - if ((Btype=1) and (Adr<>det2) and (TraceListe) ) then - AfficheDebug('N''est pas le détecteur attendu '+intToSTR(Adr)+' pour '+intToSTR(det2),clyellow); - inc(j); - sortie:=((Adr=det2) and (Btype=1)) or (j=3); - until sortie; - - if ((j=3) and (Adr<>det2)) then - begin - if (TraceListe) then AfficheDebug('Pas de suivant sur séquence '+IntToSTR(det1)+' à '+intToStr(det2),clyellow); - calcul_zones_det:=0;exit; - end; - - // étape 2 : on a trouvé le sens de progression, trouver le détecteur suivant - if (Adr=det2) then - begin - // trouvé la route si j=2 : - si j=3 : + - if (TraceListe) then AfficheDebug('Route trouvée',clyellow); - - if (TraceListe) then AfficheDebug('detecteur_suivant_el('+IntToSTR(det1)+',1,'+IntToSTR(det2)+',1',clyellow); - AdrSuiv:=detecteur_suivant_El(det1,1,det2,1); - AdrPrec:=detecteur_suivant_El(det2,1,det1,1); - - // le train vient de det1, quitte det2 et va vers Adr - // il faut vérifier si le détecteur précédent à été mis à 1 puis à 0 (on cherche 0) - //s:='Test route pour prec='+intToSTR(AdrPrec)+' det1='+intToSTR(det1)+' det2='+IntToSTR(det2) ; - //FormDebug.MemoDet.lines.add(s); - if traceListe then AfficheDebug(s,clyellow); - - // trouver l'index du détecteur (det1) à 0 - if traceListe then AfficheDebug('trouve_index_det_chrono('+intToSTR(det1)+',0,'+intToSTR(N_event_tick)+')',clYellow); - i:=trouve_index_det_chrono(det1,0,N_Event_tick); - if TraceListe then AfficheDebug('Index det='+intToSTR(i),clyellow); - - // et trouver l'index du détecteur précédent à 0 avant l'index i - if traceListe then AfficheDebug('trouve_index_det_chrono('+intToSTR(AdrPrec)+',0,'+intToSTR(i-1)+')',clYellow); - i:=trouve_index_det_chrono(AdrPrec,0,i-1); - - if TraceListe then AfficheDebug('Index prec='+intToSTR(i),clyellow); - - t:=event_det_tick[i].traite; // détecteur précédent déja traité ? - if (i=0) or t then - begin - if (i=0) and TraceListe then AfficheDebug('La mémoire préc '+intToSTR(AdrPrec)+'=0 donc route non valide',clyellow); - if t and TraceListe then AfficheDebug('La mémoire préc '+intToSTR(AdrPrec)+' a déja été traitée donc route non valide',clyellow); - calcul_zones_det:=0;exit; - end; - - if TraceListe then AfficheDebug('route ok car '+IntToStr(AdrPrec)+'=0 à l''index '+intToSTR(i)+' - DetSuivant='+intToSTR(AdrSuiv),clyellow); - - Mem[AdrPrec]:=false; // inutile - //marquer l'adresse précédente comme traitée - event_det_tick[i].traite:=true; - if traceListe then AfficheDebug('Mise à 1 mémoire traitée pour l''index '+intToSTR(i),clyellow); - - MemZone[det1,det2]:=FALSE; // efface zone précédente - MemZone[det2,AdrSuiv]:=TRUE; // valide la nouveau zone - - //if N_trains=0 then inc(N_trains); - // ajouter la route dans le tableau des routes - if N_routes<2000 then inc(N_routes); - Route[N_routes].Mem1:=det2;Route[N_routes].Mem2:=AdrSuiv; - - // affecter la route à un train - if N_trains=0 then N_trains:=1; - // premier train - if (N_trains=1) and (Train[1].index=0) then - begin - Train[1].index:=1;Train[1].route[1].Mem1:=det2;Train[1].route[1].Mem2:=AdrSuiv; - Train_Courant:=1; - //FormDebug.MemoDet.lines.add('Premier train'); - Formprinc.LabelNbTrains.caption:='1'; - end - else - begin - // parcourir les trains pour voir si det2 correspond à la derniere route du train exploré - i:=1; - repeat - j:=Train[i].index; - trouve:=Train[i].route[j].mem2=det2 ; - inc(i); - until (i>N_Trains) or trouve; - if trouve then - begin - dec(i); - //FormDebug.MemoDet.lines.add('route train '+intToSTR(i)); - train_courant:=i; - inc(j); - Train[i].index:=j;Train[i].route[j].Mem1:=det2;Train[i].route[j].Mem2:=AdrSuiv; - end - else - // nouveau train - begin - //FormDebug.MemoDet.lines.add('Nouveau train'); - inc(N_Trains); - Train[N_trains].index:=1;Train[N_trains].route[1].Mem1:=det2;Train[N_trains].route[1].Mem2:=AdrSuiv; - Train_courant:=N_trains; - Formprinc.LabelNbTrains.caption:=IntToSTR(N_trains); - end; - end; - - With FormDebug.RichEdit do - begin - s:='train '+IntToSTR(Train_Courant)+' '+intToStr(det1)+' à '+intToStr(det2)+' => Mem '+IntToSTR(det2)+' à '+IntTOStr(AdrSuiv); - Lines.Add(s); - RE_ColorLine(FormDebug.RichEdit,lines.count,CouleurTrain[((Train_Courant - 1) mod NbCouleurTrain)+1 ]); - end; - if affFD then AfficheDebug(s,clyellow); - s:='train '+IntToSTR(Train_Courant)+' Mem '+IntToSTR(det2)+' à '+IntTOStr(AdrSuiv); - Affiche(s,clyellow); - if AffAigDet then AfficheDebug(s,clyellow); - - // et effacer le premier détecteur de la route (det1) - i:=1; - repeat - trouve:=Event_det[i]=Det1; - if not(trouve) then inc(i); - until (i>N_event_det) or trouve; - if trouve then - begin - supprime_event(i); - if TraceListe then AfficheDebug('Efface index '+IntToSTR(i),clyellow); - end; - - calcul_zones_det:=10; // route trouvée et cohérente - exit; - end; + test_route_valide:=10 ; end; - -// renvoie le détecteur de la zone mémoire si la mémoire MemZone[det,xxx] est à 1 -// exemple si MemZone[513,517]=true alors Test_mem_origine(513) renvoie 517, sinon 0 -function Test_mem_origine(det : integer) : integer ; -var i : integer; - trouve : boolean; -begin - i:=513; // normalement mettre 0 pour etre compatible avec la rétrosignalisation non XpressNet - repeat - trouve:=memzone[det,i]; - if not(trouve) then inc(i); - until trouve or (i>1024); - if trouve then Test_mem_origine:=i else Test_mem_origine:=0; -end; // mise à jour de l'état d'un feu en fontion de son environnement et affiche le feu procedure Maj_Feu(Adrfeu : integer); @@ -5611,7 +5612,7 @@ begin Aff_semaphore:=test_memoire_zones(AdrFeu); // test si présence train après signal if Aff_Semaphore then begin - if AffSignal then AfficheDebug('train après signal-> sémaphore ou carré',clYellow); + if AffSignal then AfficheDebug('Présence train après signal'+intToSTR(AdrFeu)+' -> sémaphore ou carré',clYellow); if testBit(EtatSignalCplx[Adrfeu],carre)=FALSE then Maj_Etat_Signal(AdrFeu,semaphore); end else @@ -5730,11 +5731,135 @@ begin //affiche('index2='+IntToSTR(index2_det),clWhite); end; +// calcul des zones depuis le tableau des fronts descendants des évènements détecteurs +// transmis dans le tableau Event_det +procedure calcul_zones_V2; +var Nbre,Nouveau_Det,i,resultat,det1,det2,det3,AdrSuiv : integer ; + creer_tableau : boolean; + s : string; +begin + creer_tableau:=false; + det3:=event_det[N_event_det]; // c'est le nouveau détecteur + FormDebug.MemoEvtDet.lines.add('Le nouveau détecteur est '+IntToSTR(det3)) ; + if TraceListe then AfficheDebug('Le nouveau détecteur est '+IntToSTR(det3),clyellow) ; + // évaluer d'abord la route du nouveau détecteur sur tous les tableau déja rempli de 2 éléments + for i:=1 to N_trains do + begin + Nbre:=event_det_train[i].NbEl ; // Nombre d'éléments du tableau courant exploré + if Nbre=2 then + begin + if TraceListe then AfficheDebug('traitement Train n°'+intToSTR(i)+' 2 détecteurs',clyellow); + det1:=event_det_train[i].det[1]; + det2:=event_det_train[i].det[2]; + resultat:=test_route_valide(det1,det2,det3); + if resultat=10 then + begin + AdrSuiv:=detecteur_suivant_el(det2,1,det3,1); // ici on cherche le suivant à det2 det3 + if (Adrsuiv<=2) or (Adrsuiv>=9997) then + begin + Affiche('Erreur 1500 : pas de suivant sur la route de '+intToSTR(det2)+' à '+intToSTR(det3),clRed); + end + else + begin + s:='route traitée de '+intToSTR(det2)+' à '+IntToSTR(det3)+' Mem '+intToSTR(det3)+' à '+IntToSTR(Adrsuiv); + FormDebug.MemoEvtDet.lines.add(s); + if traceListe then AfficheDebug(s,clyellow); + With FormDebug.RichEdit do + begin + s:='train '+IntToSTR(i)+' '+intToStr(det2)+' à '+intToStr(det3)+' => Mem '+IntToSTR(det3)+' à '+IntTOStr(AdrSuiv); + Lines.Add(s); + RE_ColorLine(FormDebug.RichEdit,lines.count,CouleurTrain[((i - 1) mod NbCouleurTrain)+1 ]); + end; + if TraceListe then AfficheDebug(s,clyellow); + Affiche(s,clyellow); + if AffAigDet then AfficheDebug(s,clyellow); + + MemZone[det2,det3]:=FALSE; // efface zone précédente + MemZone[det3,AdrSuiv]:=TRUE; // valide la nouveau zone + // supprimer le 1er et décaler + event_det_train[i].det[1]:=event_det_train[i].det[2]; + event_det_train[i].det[2]:=det3; + event_det_train[i].NbEl:=2; + with FormDebug.MemoEvtDet do + begin + lines.add('Nouveau Tampon train '+intToStr(i)+'--------'); + lines.add(intToSTR(event_det_train[i].det[1])); + lines.add(intToSTR(event_det_train[i].det[2])); + end; + if TraceListe then + begin + AfficheDebug('Nouveau Tampon train '+intToStr(i)+'--------',clyellow); + AfficheDebug(intToSTR(event_det_train[i].det[1]),clyellow); + AfficheDebug(intToSTR(event_det_train[i].det[2]),clyellow); + end; + rafraichit; + rafraichit; + rafraichit; + exit; // sortir absolument + end; + end; + end; + end; + + // traiter pour les cas avec 1 élément + for i:=1 to N_trains do + begin + Nbre:=event_det_train[i].NbEl ; // Nombre d'éléments du tableau courant exploré + if Nbre=1 then + begin + if traceListe then AfficheDebug('traitement Train n°'+intToSTR(i)+' 1 détecteur',clyellow); + // vérifier si l'élément du tableau et le nouveau sont contigus + det1:=event_det_train[i].det[1]; + Det_Adj(det1); + if (Adj1=det3) or (Adj2=det3) then + begin + event_det_train[i].det[2]:=det3; + event_det_train[i].NbEl:=2; + with FormDebug.MemoEvtDet do + begin + lines.add('Nouveau Tampon train '+intToStr(i)+'--------'); + lines.add(intToSTR(event_det_train[i].det[1])); + lines.add(intToSTR(event_det_train[i].det[2])); + end; + if TraceListe then + begin + AfficheDebug('Nouveau Tampon train '+intToStr(i)+'--------',clyellow); + AfficheDebug(intToSTR(event_det_train[i].det[1]),clyellow ); + AfficheDebug(intToSTR(event_det_train[i].det[2]),clyellow ); + end; + exit; // sortir absolument + end; + end; + end; + + // créer un train, donc un tableau + if N_Trains>=Max_Trains then + begin + Affiche('Erreur nombre de train maximal atteint',clRed); + end; + Inc(N_trains); + if TraceListe then AfficheDebug('Création Train n°'+intToSTR(i),clyellow); + Formprinc.LabelNbTrains.caption:=IntToSTR(N_trains); + event_det_train[N_trains].det[1]:=det3; + event_det_train[N_trains].NbEl:=1; + with FormDebug.MemoEvtDet do + begin + lines.add('Nouveau Tampon train '+intToStr(N_trains)+'--------'); + lines.add(intToSTR(event_det_train[N_trains].det[1])); + end; + if TraceListe then + begin + AfficheDebug('Nouveau Tampon train '+intToStr(N_trains)+'--------',clyellow); + AfficheDebug(intToSTR(event_det_train[N_trains].det[1]),clyellow ); + end; +end; + // calcul des zones depuis le tableau des fronts descendants des évènements détecteurs // transmis dans le tableau Event_det // appellé par front descendant sur détecteur // met à jour le tableau MemZone +(* plus utilisé procedure calcul_zones ; var i,det1,det2,index_1,index_2,index_3,resultat : integer; unevalide : boolean; @@ -5754,6 +5879,7 @@ begin repeat index_2:=index_1+1; repeat + //det0:=event_det[index_ det1:=event_det[index_1]; det2:=event_det[index_2]; //if det1=det2 then // si détecteurs identiques, supprimer le 2eme @@ -5770,15 +5896,16 @@ begin begin AfficheDebug('-------Cherche route de '+intToSTR(det1)+' à '+intToSTR(det2)+' i1='+intToSTR(index_1)+' i2='+intToSTR(index_2)+' n='+intToSTR(N_event_det),clyellow); end; - resultat:=calcul_zones_det(det1,det2); + resultat:=calcul_zones_det(det1,det2); if resultat=10 then begin - s:='route traitée de '+intToSTR(det1)+' à '+IntToSTR(det2); + s:='route traitée de '+intToSTR(det1)+' à '+IntToSTR(det2)+' Mem '+intToSTR(det2)+' à '+IntToSTR(El_suivant); FormDebug.MemoEvtDet.lines.add(s); if traceListe then AfficheDebug(s,clyellow); uneValide:=true; FormDebug.MemoEvtDet.lines.add('Nouveau Tampon:'); - affiche_Event_det; + if traceListe then AfficheDebug('Nouveau Tampon',clyellow); + affiche_Event_det; end; // détecteur1 non trouvé @@ -5799,7 +5926,7 @@ begin rafraichit; rafraichit; end; -end; +end; *) // demande l'état d'un accessoire à la centrale. Le résultat sera réceptionné sur réception des informations // de rétrosignalisation. @@ -5807,6 +5934,7 @@ procedure demande_info_acc(adresse : integer); var s : string; n : integer; begin + // uniquement si connecté directement à la centrale if portCommOuvert or ParSocket then begin // envoyer 2 fois la commande, une fois avec N=0 pour récupérer le nibble bas, @@ -5836,38 +5964,6 @@ begin end; end; -// affecte le numéro de train à un évènement détecteur -// en sortie : numéro de train -{ -function affecte_train(index,AdresseAdj,AdresseActuel,etat : integer) : integer; -var i,train : integer; - trouve : boolean; -begin - if AffAffect then AfficheDebug('Cherche train pour Index='+intToSTR(index)+' pour détecteur='+intToStr(AdresseAdj)+' à '+intToStr(Etat),clyellow); - train:=0; - if index<2 then begin Affecte_train:=1;exit;end; - i:=index; - repeat - dec(i); - trouve:=event_det_tick[i].detecteur[AdresseAdj]=etat; // si le détecteur à rechercher en amont de la liste est à "etat" - until trouve or (i=1); - if trouve then - begin - train:=event_det_tick[i].train; - //if train<>0 then - begin - if AffAffect then AfficheDebug('Affectation au train n°'+intToSTR(train),clyellow); - event_det_tick[N_event_tick].train:=train; - event_det_tick[N_event_tick].suivant:=AdresseActuel; - - //event_det_tick[i].train:=0; // traité - end; - end - else - if AffAffect then AfficheDebug('Pas trouvé',clyellow); - affecte_train:=train; -end; -} // traitement des évènements actionneurs procedure Event_act(adr,etat : integer;train : string); @@ -5925,12 +6021,13 @@ begin end; end; -// traitement sur les évènements détecteurs +// traitement sur les évènements détecteurs procedure Event_Detecteur(Adresse : integer;etat : boolean); var i,trainAdj1,TrainAdj2,TrainActuel,Etat01 : integer; s : string; begin if Etat then Etat01:=1 else Etat01:=0; + // vérifier si l'état du détecteur est déja stocké, car on peut reçevoir plusieurs évènements pour le même détecteur dans le même état // on reçoit un doublon dans deux index consécutifs. if N_Event_tick>=1 then @@ -5947,7 +6044,7 @@ begin begin s:='Evt Det '+intToSTR(adresse)+'='+intToSTR(etat01); Affiche(s,clyellow); - AfficheDebug(s,clyellow); + if not(TraceListe) then AfficheDebug(s,clyellow); end; //if etat then Mem[Adresse]:=true; // mémoriser l'état à 1 @@ -5977,9 +6074,24 @@ begin if AffFD then AfficheDebug('index='+intToSTR(N_event_tick)+' FD '+intToSTR(Adresse),clyellow); inc(N_event_det); event_det[N_event_det]:=Adresse; - if not(configNulle) then calcul_zones; // en avant les calculs + // vérification de la connaissance de la position de tous les aiguillages au premier évènement FD détecteur + if not(PremierFD) then + begin + for i:=1 to MaxAiguillage do + begin + if aiguillage[i].modele<>0 then + begin + if aiguillage[i].position=9 then + Affiche('Attention : position de l''aiguillage '+IntToSTR(i)+' inconnue',clred); + AfficheDebug('Attention : position de l''aiguillage '+IntToSTR(i)+' inconnue',clred); + end; + end; + end; + premierFD:=True; + if not(configNulle) then calcul_zones_V2; // en avant les calculs end; end; + if (N_event_det>=Max_event_det) then begin Affiche('Débordement d''évènements FD - Raz tampon',clred); @@ -5988,46 +6100,12 @@ begin end; // attention à partir de cette section le code est susceptible de ne pas être exécuté - // Mettre à jour le TCO if AvecTCO then begin formTCO.Maj_TCO(Adresse,etat); end; - - exit; - //------------------------plus utilisé ---------------- - { - // front descendant - if etat01=0 then - begin -// affecte_train(N_event_tick,Adresse,0,1); // affecter le numéro du train dont l'adresse du détecteur est à 1 - end; - if etat01=1 then - begin - det_adj(Adresse); // détecteurs adjacents à Adr (adj1 et adj2) - if Adj1>9997 then Adj1:=0; - if Adj2>9997 then Adj2:=0; - if AffAffect then AfficheDebug('Det='+intToStr(Adresse)+' Adj1='+intToStr(Adj1)+' Adj2='+intToStr(Adj2),clyellow); - - //affecter le numéro de train sur l'un des deux détecteurs adjacents à 0 - if adj1<>0 then trainAdj1:=affecte_train(N_event_tick,Adj1,Adj2,0); // affecter le numéro du train dont l'adresse du détecteur est à 0 - if adj2<>0 then trainAdj2:=affecte_train(N_event_tick,Adj2,Adj1,0); // affecter le numéro du train dont l'adresse du détecteur est à 0 - if AffAffect then AfficheDebug('Det='+intToSTR(Adresse)+' TrainAdj1='+intToSTR(TrainAdj1)+' TrainAdj2='+intToSTR(TrainAdj2),clyellow); - if (trainAdj1=0) and (TrainAdj2=0) then - begin - inc(N_trains); - if AffAffect then - begin - s:='Nouveau train sur '+intToSTR(Adresse)+'='+intToSTR(N_trains); - affiche(s,clyellow); - afficheDebug(s,clyellow); - end; - event_det_tick[N_event_tick].train:=N_trains; - end; - end; - } end; // évènement d'aiguillage @@ -6035,7 +6113,6 @@ procedure Event_Aig(adresse,pos,objet : integer); var s: string; begin // ------------------- traitement du numéro d'objet ------------------------- - aiguillage[adresse].position:=pos; // il faut mémoriser le numéro d'objet le plus bas au détriment de celui qui a la même adresse // mais un numéro d'objet supérieur (bug CDM sur bretelles avec aiguillages à la même adresse) // init objet @@ -6059,6 +6136,17 @@ begin AfficheDebug(s,clOrange); exit; end; + + aiguillage[adresse].position:=pos; + + if aiguillageB[adresse].inversionCDM=0 then aiguillageB[adresse].position:=pos + else + begin + if pos=const_devie then aiguillageB[adresse].position:=const_droit; + if pos=const_droit then aiguillageB[adresse].position:=const_devie; + + end; + // ------------- stockage évènement aiguillage dans tampon event_det_tick ------------------------- if (N_Event_tick0 then Affiche(Line[i],clyellow); - //end; //essai - // event_det[1]:=527; - // event_det[2]:=520; - // N_event_det:=2; - // aiguillage[23].Position:=const_droit; - // aiguillage[12].Position:=const_droit; - //traceDet:=true; - // calcul_zones; //maj_feu(201); // formdebug.Show; //AfficheDet:=true; @@ -6726,6 +6802,7 @@ begin //envoi(s); //id_cdm:='01'; //envoie_fonction_CDM(0,1,'train'); + //i:=ShellExecute(handle,PChar('open'),PChar('C:\Program Files (x86)\CDM-Rail\cdr.exe'),nil,nil,SW_SHOWNORMAL); end; @@ -6787,7 +6864,9 @@ end; // timer à 100 ms procedure TFormPrinc.Timer1Timer(Sender: TObject); -var i,a : integer; +var index,aspect,i,a,x,y,adresse,TailleX,TailleY : integer; + imageFeu : Timage; + frx,fry : real; s : string; begin inc(tick); @@ -6821,12 +6900,56 @@ begin //tester chaque feu pour voir s'il y a un code de clignotement for i:=1 to NbreFeux do begin - a:=EtatsignalCplx[feux[i].adresse]; // a = état binaire du feu + adresse:=feux[i].adresse; + a:=EtatsignalCplx[adresse]; // a = état binaire du feu if TestBit(a,jaune_cli) or TestBit(a,ral_60) or TestBit(a,rappel_60) or testBit(a,semaphore_cli) or testBit(a,vert_cli) or testbit(a,blanc_cli) then - Dessine_feu(feux[i].adresse); // dessiner le feu en fonction du bit "clignotant" + begin + //Affiche(IntToSTR(adresse),clOrange); + Dessine_feu_mx(Feux[i].Img.Canvas,0,0,1,1,adresse,1); + end; end; + + if avecTCO then + begin + for i:=1 to NbFeuTCO do + begin + x:=(FeuTCO[i].x-1)*LargeurCell; + y:=(FeuTCO[i].y-1)*HauteurCell; + adresse:=FeuTCO[i].adresse; + if adresse<>0 then + begin + index:=index_feu(adresse); + if index<>0 then + begin + aspect:=feux[index].aspect; + case aspect of + 2 : ImageFeu:=Formprinc.Image2feux; + 3 : ImageFeu:=Formprinc.Image3feux; + 4 : ImageFeu:=Formprinc.Image4feux; + 5 : ImageFeu:=Formprinc.Image5feux; + 7 : ImageFeu:=Formprinc.Image7feux; + 9 : ImageFeu:=Formprinc.Image9feux; + else ImageFeu:=Formprinc.Image3feux; + end; + + TailleY:=ImageFeu.picture.BitMap.Height; // taille du feu d'origine (verticale) + TailleX:=ImageFeu.picture.BitMap.Width; + frx:=LargeurCell/TailleX; + frY:=2*HauteurCell/TailleY; + + a:=EtatsignalCplx[adresse]; // a = état binaire du feu + if TestBit(a,jaune_cli) or TestBit(a,ral_60) or + TestBit(a,rappel_60) or testBit(a,semaphore_cli) or + testBit(a,vert_cli) or testbit(a,blanc_cli) then + Dessine_feu_mx(PCanvasTCO,x,y,frx,fry,adresse,1); + end; + end; + end; + end; + + // fenêtre de pilotage manuel du feu if AdrPilote<>0 then begin a:=EtatsignalCplx[0]; @@ -6872,6 +6995,7 @@ begin N_Event_tick:=0; N_event_det:=0; N_trains:=0; + for i:=1 to Max_Trains do Event_det_Train[i].NbEl:=0; FormDebug.MemoEvtDet.Clear; FormDebug.Richedit.Clear; end; @@ -6887,13 +7011,13 @@ begin // if Tablo_simule[i_simule].detecteur=538 then Affiche('création evt 538 index '+intToSTR(i_simule),clorange); // end; - Affiche('Simulation '+intToSTR(I_simule)+' Tick='+IntToSTR(tick)+' det='+intToSTR(Tablo_simule[i_simule].detecteur)+'='+IntToSTR(Tablo_simule[i_simule].etat),Cyan); + if AffTickSimu then Affiche('Simulation '+intToSTR(I_simule)+' Tick='+IntToSTR(tick)+' det='+intToSTR(Tablo_simule[i_simule].detecteur)+'='+IntToSTR(Tablo_simule[i_simule].etat),Cyan); Event_Detecteur(Tablo_simule[i_simule].detecteur, Tablo_simule[i_simule].etat=1); // créer évt détecteur end; // evt aiguillage ? if Tablo_simule[i_simule].aiguillage<>0 then begin - Affiche('Simulation '+intToSTR(I_simule)+' Tick='+IntToSTR(tick)+' aig='+intToSTR(Tablo_simule[i_simule].aiguillage)+'='+IntToSTR(Tablo_simule[i_simule].etat),Cyan); + if AffTickSimu then Affiche('Simulation '+intToSTR(I_simule)+' Tick='+IntToSTR(tick)+' aig='+intToSTR(Tablo_simule[i_simule].aiguillage)+'='+IntToSTR(Tablo_simule[i_simule].etat),Cyan); Event_Aig(Tablo_simule[i_simule].Aiguillage,Tablo_simule[i_simule].etat,0); // créer évt aiguillage end; @@ -7162,6 +7286,8 @@ begin ' Droit='+IntToSTR(aiguillage[i].ADroit)+aiguillage[i].ADroitB; if aiguillage[i].modele=4 then s:=s+' Dévié2='+intToSTR(aiguillage[i].ADevie2)+aiguillage[i].ADevie2B; if aiguillage[i].vitesse<>0 then s:=s+' Vitesse déviée='+intToSTR(aiguillage[i].vitesse); + if aiguillage[i].inversion<>0 then s:=s+' pilotage inversé'; + Affiche(s,clYellow); end; end; @@ -7180,6 +7306,8 @@ begin ' Droit='+IntToSTR(aiguillageB[i].ADroit)+aiguillageB[i].ADroitB; if aiguillageB[i].modele=4 then s:=s+' Dévié2='+intToSTR(aiguillageB[i].ADevie2)+aiguillageB[i].ADevie2B; if aiguillageB[i].vitesse<>0 then s:=s+' Vitesse déviée='+intToSTR(aiguillageB[i].vitesse); + if aiguillageB[i].inversion<>0 then s:=s+' pilotage inversé'; + if aiguillageB[i].inversionCDM<>0 then s:=s+' lecture CDM inversée'; Affiche(s,clYellow); end; end; @@ -7450,6 +7578,8 @@ begin Affiche('Version 1.43 : Correction erreur gestion sémaphore',clLime); Affiche('Version 1.44 : Gestion trains avec voitures éclairées',clLime); Affiche('Version 1.45 : Rejette les n° d''objets supérieurs aiguillages à la même adresse',clLime); + Affiche('Version 1.5 : Nouvel algorithme de suivi des trains',clLime); + end; procedure TFormPrinc.ClientSocketLenzDisconnect(Sender: TObject; @@ -7666,10 +7796,10 @@ end; procedure TFormPrinc.Button2Click(Sender: TObject); var i : integer; begin - nivDebug:=3; - //test_memoire_zones(1005); - MemZone[569][538]:=true; - test_memoire_zones(177); + //traceliste:=true; + //NivDebug:=3; + i:=test_route_valide(519,517,518); + Affiche(IntToSTR(i),clOrange); end; diff --git a/UnitSimule.dcu b/UnitSimule.dcu index 010bd65c4290544aa546b77b00b2b29a735510a1..6cf92cec4c84360e890d92589a735f0a808ab153 100644 GIT binary patch delta 2652 zcmai04RBOf6~5=}=H+CwY&OYeo33GbSdQlNwa$s&L4WJ%s8TQ(bf zyUBnf-7JtwT({Hk8WpW5RXP;KX+RvvG&7;C+Bn4lM;&Y@DoU9$Ht48zGMdSH?k;Ik zW%TXdbME)u@1Aq-d3SH}&bmZ(_V0wqS>P7Jy64DXwyV&x=g3x}+q|Jbq&d*l6V%Gv z{auTnhz>sba*jW%rM^>Z+h5mx@VSn){~G+`Vta?B{3EXC!?P0?E#S6TGwZs$gPJe& zS^G1U#^UTn7n`%aP;9H&;0v_}wZ=fm7YrV1_?z!Y2i0tDj_CD4{l?kDmyB_%yZzT~ zYp6*JhkYGdSp1Sf^P#Xe5(tLH&l&9S=>cCT5*BZ_t;wtp`odvWz0L!V>AnMyTYQJ_3Hz^V0TAYlo*dM_>^yb;KeT%iKRI$QjprKFB0eu z9e?uOC1>2K?c?m7{k8RH+-p_K#!y7ldwKoZoi}Y)7vxo{*|mOuOQ3DP3~@*6{c5G7 zO2zV3e%1Ktf=61mpL%FqY|AH4vAJ0b`kij2SZUTm?V9eip$cKYb4tZfqu==#)#Q(8 z{=(B!Dg>N)LWTX(Dw?iqJ-R>deN_o}>yd!wbQtSwixxG@z!x4Ix2>$yxNdWQ`f=^h zR-J3v*CNHgeX!VLVwux!o=auCZCg_6{U1~2Nk5VEaJi@L6qZ@$j!d7BkG{?L?Ydx`c9wTq16Yuu8w;{ zNXsqqebnokFQPf_jWS`}%6-V>xHoS6ImcByfz-C16RA0zxGyJ}Oh&iXa5w1nY-TtA zF*B$EA-=^;K8SqwO&7P>^TBAfXPPra9vYpw8}i8{gjsxSg~qG7VaPDH*$a${yp_?S znPjqg$LjHcgzOC@N>WypwrP5xX)1m*ULjMg9`knU9IZXMqJ2P(AC-~g_T-7Tct);8W(%nhqmD)Zj>2TzOU_)U2>wlGegjn!k{5yl1QV(?yk$GHrm zkC=pV7zG^Wt0IQPUN(EGts;1fpq;=^@Oy%%3I0HEn_wToGX&KHKO@*cu!&$R!4C-D zB-lyt6M`)SPZ1m;=p#5r@NI(U2-XvvAb5%3y9A8{FB6<4h@K<(K0yn?c7j(4b`xA6 z_!`0230@>PMGzraL+~uYT7pV~DuUw#Un2Mn!Iuf1C)iBz0>M`Zf&{$;2MP8P)DYAW z>>y|*=p+ac93arGysg(^2v@);dSD!@AUc6NpopN1z)heMcu0wHIbygpRf-j*$`Ech zDR!Q<3KD3?>#}RXl~{yJi&EVR{7+wp%Zl)?PW*=j*I^m{(}~lvm!1i@0<+MGxoCxf zC^}&PohEY2uf>@P2s|gPaF{HG|4pUS{Xdll7xFsS;m%Y5o6KXuUwBgJQB=|9!X+4$ z3X93^#vigR!5>+mpJksV#baeQxbSl~QBawL5Bd;5q8bz-4H|0~W$ctj1Qdq`lcMY=el~P@F*i$HeI}Htj~i zAAa>H95Li8+ZjVMiozHwC|vx@Kv5Lq$_V!m3dQVE8~Kk73UySX63=vu^9awlM5QGK z7>)62M9GB2Wu+@Qa2|@%ei?r4fV7nfX{%03`#s(CP3ap?OS|Dr%Dy7)rt{Kn9!}Xy zDSJiQEmx%#KbCg-nzVyOH>4}TU!`0We*sGkx<))eQ7%+?TIBuR9#!DGu81H57 d>sd&&ymzX5!iv&H}b delta 2415 zcmaJ?4Qx}_6~5=#c|I|T{Tdu&8RI@@DFl|#6as<{SV%$$9ZZb;EM;AV7e6Pa#v!)T z)o8&fkgA^X)bPsGPN8b14wb2y2q_bZM3t6yTPHFtRjYQWDV?Tuoz}6b>!x(d;+<c%(fd_m)#V?e#0ZguC~6xWo{Q5-`y{ww$?}}-W)p88`jqc zf=BwEiVbc*Klt&Qv9;i}uCwlp#6r#SXeiQ|d^7uYkXrOd;*FuOe)ig*E(I-h-Q8i` zANi(we9KtRvNrHh?Os;bhojTa_g(I^)i(Jffw0~fiul9f#IAq%PZ%E-c>`~B)X+XX z7V~%NG4Wdl&52lRJQR+JUo&X)M??NdJSKkCQDdnO`(rUyy~GQl;G;aCc`+XvX2dxm@C#lc-8iDvAS8q^&5g-<_qF*>V3$f*hq9+Fnkqfxy#8dU$TDY5QoJfu6F zqNBq7xzg6ln(CvvKd$$0m$|MiNkxmfj1k+HH|&st_m&72*Rjm>H9g_9nLkTB+fh+& zjM}`r>%07sPQCxDU$A@0uAW;eJc)UBpIisC=eK^$dkmFVgsml7ULTvV5t%_0lNi+3~`_L7*% zEQHacE;oiss*>gN*=%#$#@ADs3ZA7h5~udfrQb(1MW#kEEGmFp(s?d3k0H9lRw2j4Xr6OL7@X44BLr=6xZ(#5j) zRKv8HtG)7($vEy<#quGC2WP)XPM?#zOkA2#Rl2ExxRv<=&&tLP%lP?va*fOk$fizI zEUMCZoXsw%vNjp$d}-arjgtrOzdw*tyUMslnE@GWf_t(MeBlh&{w(AF<^2c0mHy+m zuNe)_L&kOI3#(ew9~~CW>38H^eS-!0yZU8;6oYYT#TsZIyRo7Yl7%Lr^rC=X{w*eu z*vp~j#(IKR2@Vl_hu~d;Ai;YC?-M*oaExFJ!7m6J2pS3Y68w~4lAwj)6@vQ+4iX$E z_#Qz&!4Sds32F&`K=2H~vjlYnKPGsNAbFnPd4l}}Unh8hppD>X1WywDkl-nT9}yfS zs3tf;uz{e4U^Brfg2xE%C3u|RG(i)=69i`nx(K2Kae{V&Z3H_A4iG#*5Fj{A5GIHe z@v(*=h1D>EWiXESLUIb*z)et2;34pmlHgt>a9yqsm8+E$)|wQRw|MZnbXHu;)775b zvg=;yqY_|8nB2oaJ}SRU@Di3$X|uMW-Al^2(3Z2}v1pu3|ypFj-x> z$hR~39Je$7t0}`$j&l#T=XTp<5-a|uEQdCshBi0)assPK_2Nag<#@>oeVDZ3!)}&o zxD{30jzzc={bpqZUECrUhmnIrdGJLyGm8?3GLGfkzzY1iJeZY5@^B?QWM3C$PGyQ^ zQ~zH!C1usQj80_+Z7{>h2GGr3R-r0rW>{pwCr<4BCt-l)ZuA&$t~{7jBDBYhmFU2u zR>Cc~4G)nu@6ADB8${kO&LIDDJ6%RY3krVo#iDQ|5K%Z2Xhz{mpn}59UwRat6bi+x zdF%LjjKVu2QJMBhf-4c)xJ2b;1suYLqHGG2j8~WY7^^7C`()snN2T4Ik#?-rGAMoB zS!o-dmbUSnv`xb~`;(l#Ankpl($=?IE=&K(RcXI;%=EJK1^8Oty)IoLPD}TP-{V_J zIq~7|q`M1eq}z^9wxn>UsmCI!OEMTxGT4Lj=WxU%&S9~6ei%PBi(#xPV9sB_+-L!F zGX>0*D$MOsn0s1b?lpzE|444Dg}Ic4xyu&j{%T>)N6a1QAtuielW)=d1=I`01so`x sAHiA@YRM>8Dx-LDejIC6hF5WmauwtAQ+YVeaGK!^YWyrxb5{8O3u^3pQ~&?~ diff --git a/UnitSimule.dfm b/UnitSimule.dfm index b0f9e00..3000e8b 100644 --- a/UnitSimule.dfm +++ b/UnitSimule.dfm @@ -43,10 +43,18 @@ object FormSimulation: TFormSimulation Width = 49 Height = 21 TabOrder = 1 - Text = '1' + Text = '0' OnChange = EditIntervalleChange OnKeyPress = EditIntervalleKeyPress end + object CheckAffTick: TCheckBox + Left = 64 + Top = 64 + Width = 225 + Height = 17 + Caption = 'Afficher les ticks pendant la simulation' + TabOrder = 2 + end object OpenDialog: TOpenDialog Left = 48 Top = 96 diff --git a/UnitSimule.pas b/UnitSimule.pas index bc3c080..df74fc7 100644 --- a/UnitSimule.pas +++ b/UnitSimule.pas @@ -12,6 +12,7 @@ type OpenDialog: TOpenDialog; EditIntervalle: TEdit; Label1: TLabel; + CheckAffTick: TCheckBox; procedure ButtonChargeClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure EditIntervalleKeyPress(Sender: TObject; var Key: Char); @@ -25,26 +26,29 @@ type var FormSimulation: TFormSimulation; Intervalle : integer; + AffTickSimu : boolean; implementation {$R *.dfm} procedure TFormSimulation.ButtonChargeClick(Sender: TObject); -var s : string; +var s,nF : string; fte : textFile; i,k,erreur : integer; sortie : boolean; begin + AffTickSimu:= checkAffTick.Checked; s:=GetCurrentDir; s:='C:\Program Files (x86)\Borland\Delphi7\Projects\Signaux_complexes_GL'; OpenDialog.InitialDir:=s; OpenDialog.DefaultExt:='txt'; + OpenDialog.Title:='Ouvrir un fichier de simulation'; OpenDialog.Filter:='Fichiers texte (*.txt)|*.txt|Tous fichiers (*.*)|*.*'; if openDialog.Execute then begin - s:=openDialog.FileName; - assignFile(fte,s); + nF:=openDialog.FileName; + assignFile(fte,nF); reset(fte); index_simule:=1; repeat @@ -115,13 +119,13 @@ begin FormSimulation.Close; end; - + Affiche('Fichier simulation : '+nF ,clyellow); end; procedure TFormSimulation.FormCreate(Sender: TObject); begin - Intervalle:=1; + Intervalle:=0; EditIntervalle.Text:=IntToSTR(Intervalle); end; @@ -136,7 +140,7 @@ end; procedure TFormSimulation.EditIntervalleChange(Sender: TObject); var erreur : integer; begin - Val(EditIntervalle.Text,intervalle,erreur); + Val(EditIntervalle.Text,intervalle,erreur); if (intervalle<0) then Intervalle:=1; end; diff --git a/UnitTCO.dcu b/UnitTCO.dcu index 1f0a4e09e93aa7d0469b1f440575e90c5520bf65..01fff9a2feaa36de5665e76f0d87d757657e5b7c 100644 GIT binary patch delta 22079 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 or (Adr<0) or (Adr>2048) then @@ -1794,8 +1817,20 @@ begin EditAdrElement.text:=intToSTR(tco[XClicCell,YClicCell].Adresse); exit; end; + tco[XClicCell,YClicCell].Adresse:=Adr; affiche_cellule(XClicCell,YClicCell,pmCopy); + // si c'est un feu, mettre à jour le tableau FeuTCO + if tco[XClicCell,YClicCell].BImage=12 then + begin + + i:=0; + while i-uLW4=YqC!ve_qU-~5@WU`HvnRp6Jd`An6^;&GlgUy{%`i#5~H<&Vj i++#lZq_o`R7t*quIb_zeFs_}vL*XUk)Xj?&*_i;Q07^sv delta 269 zcmZ4BzS5ohJ_7^)N@WHH*Ra}&+_KEOgDN*_U*Q)zpIFf##U%9~2v`^x7!37HHVX)_ zGBPnrY!(+h%E)NA`L57AHpU5)&qzv&T>&cT4*l~2sF0z%_0Qk`|I@m8zfAruDW%51 z%D?~-pZWtR-s}2jrwB|a!vV<{9 diff --git a/verif_version.pas b/verif_version.pas index 0348aec..14be910 100644 --- a/verif_version.pas +++ b/verif_version.pas @@ -22,7 +22,7 @@ var FormVersion: TFormVersion; Lance_verif : integer; -Const Version='1.45'; //Version='1.2';// sert à la comparaison de la version publiée +Const Version='1.5'; //Version='1.2';// sert à la comparaison de la version publiée implementation