From 045a37cce401aa1cfeaac2f49080d8ee47039727 Mon Sep 17 00:00:00 2001 From: f1iwq2 Date: Mon, 20 Jan 2020 19:09:57 +0100 Subject: [PATCH] Initial commit --- .gitattributes | 2 + 2feux.bmp | Bin 0 -> 2086 bytes 3feux.bmp | Bin 0 -> 2310 bytes 4feux.bmp | Bin 0 -> 2674 bytes 5feux.bmp | Bin 0 -> 2926 bytes 7feux.bmp | Bin 0 -> 5082 bytes 9feux.bmp | Bin 0 -> 5810 bytes Desinstall.bat | 11 + Signaux_complexes_GL.cfg | 42 + Signaux_complexes_GL.dof | 138 + Signaux_complexes_GL.dpr | 14 + Signaux_complexes_GL.exe | Bin 0 -> 693248 bytes Signaux_complexes_GL.res | Bin 0 -> 3008 bytes UnitDebug.dcu | Bin 0 -> 6336 bytes UnitDebug.dfm | 120 + UnitDebug.pas | 93 + UnitDebug.~dfm | 120 + UnitDebug.~pas | 91 + UnitPrinc.dcu | Bin 0 -> 129375 bytes UnitPrinc.dfm | 1037 +++++++ UnitPrinc.pas | 5520 ++++++++++++++++++++++++++++++++++++++ UnitPrinc.~dfm | 1037 +++++++ UnitPrinc.~pas | 5520 ++++++++++++++++++++++++++++++++++++++ VBCTRLS.REG | 16 + client-GL.cfg | 81 + client-GL.~cfg | 41 + config.cfg | 112 + config.~cfg | 112 + config.~~cfg | 158 ++ configgily.cfg | 109 + install.bat | 22 + install2.bat | 22 + mscomm32.ocx | Bin 0 -> 103744 bytes 33 files changed, 14418 insertions(+) create mode 100644 .gitattributes create mode 100644 2feux.bmp create mode 100644 3feux.bmp create mode 100644 4feux.bmp create mode 100644 5feux.bmp create mode 100644 7feux.bmp create mode 100644 9feux.bmp create mode 100644 Desinstall.bat create mode 100644 Signaux_complexes_GL.cfg create mode 100644 Signaux_complexes_GL.dof create mode 100644 Signaux_complexes_GL.dpr create mode 100644 Signaux_complexes_GL.exe create mode 100644 Signaux_complexes_GL.res create mode 100644 UnitDebug.dcu create mode 100644 UnitDebug.dfm create mode 100644 UnitDebug.pas create mode 100644 UnitDebug.~dfm create mode 100644 UnitDebug.~pas create mode 100644 UnitPrinc.dcu create mode 100644 UnitPrinc.dfm create mode 100644 UnitPrinc.pas create mode 100644 UnitPrinc.~dfm create mode 100644 UnitPrinc.~pas create mode 100644 VBCTRLS.REG create mode 100644 client-GL.cfg create mode 100644 client-GL.~cfg create mode 100644 config.cfg create mode 100644 config.~cfg create mode 100644 config.~~cfg create mode 100644 configgily.cfg create mode 100644 install.bat create mode 100644 install2.bat create mode 100644 mscomm32.ocx diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/2feux.bmp b/2feux.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5448bb98421c60cdc0726666cffc92eeddc815db GIT binary patch literal 2086 zcmd7RF|O1=41i%HD5y99l?#M80kuU>!wGy8AH@aY94@Fh1BH+9s@G5~|BRE}eIQXG zM6zEzu`|hJGW+4<+n2Jp_b)`=(Rz(HcqUVLcrNnw)z}wa4qc+7pGAP=UhW2qX$UpUsqL za0C*Co=@sZG&ll@LeJ;sArS^gAW`U93aLbcBakTcER#~A!4XIldM}}9B^n%oM4_d4 z{}P445lF1PXKASt4URyf(6j7Ji3Ud?QRrEcu0(?)kSO#l*HEIt5l9qzmU1f5;0PoN zJHZyltIey;@#t{v_dnHcQ+@qx=QwAwkHJ2Dhky1R&Uw8b%M69%{XlQS zJPK#=I@v3+YDc{0C%yB3Ui0%`nB#Gu{Wn|f={c>(dGwKd+;LLJGcS`n`d$03ft;Jj EPaW<#KL7v# literal 0 HcmV?d00001 diff --git a/3feux.bmp b/3feux.bmp new file mode 100644 index 0000000000000000000000000000000000000000..47fae9bd51be8bd7d88fe029bccd111f48dfd2de GIT binary patch literal 2310 zcmeIyEs_;M48ZYFMNwcl04frJMyK!?PLQMIC=nFrh(Mt@03t_NwFa^LyEF6lJ*dJ! zp_rLpr(ZH3Jw3hq?)|eDvbVQSMPAc;g*SL2&v*VS`Oh!MPF$K0;gE<4v~;Daq`sBh zefcD!1_uRA6k5at3OeQpBnmC!0)>Ge9!M1Wc&-u+jzFT&B6KAc21g)KXa*@z7#x8_ zp+z{P6$VEjQD`w?n4(y_BakTcyqYS};0PoNJ+Ey_G&ll@LeG@A5)F<(qR=y4p+tit zkSO#_Wh&9&2qX$U(_Bh4I0A`6?@wT@M1v!cD6|CcAEH=q?pS-G&=M+87#x8_q35%i z5)F<(qR{h6U5N%qAW`V~+&m=0;0PoNJxd{#XmA7)g`Qc(!Tm%Y_8|`ss|WU#TEEYY{NDI|zjM33dS_+DT{*5jDw8^| zJ!^CF&hBT;rSr_yPUUjee$38ZRd$tTd-j VgV?q6qPguQb^L>RtR9t>_yK&|S&sk! literal 0 HcmV?d00001 diff --git a/4feux.bmp b/4feux.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b05e7d7396b557f9b3e9a34ad5d7f84eb063dbb5 GIT binary patch literal 2674 zcmeIzF^=6v41i%8FapDc50HvwP7okK3c`JwoPcM@33wD1LC(R#RnCxtM{t$K#pa)( z=J~xf;KE2@z?R-8j)od(W;CmP``aI{Wp6*f6#0qLkN5>IjFQL0MnpOW`~|0SXZ2MJ9STEqkj3g!qT3N7LSg@F?fBno{!SBVBkAW>)$ijoS0 zBakRGofIexjzFT&BK)Kk21g)KXfdIiqFB2lkSO#FO_gYH1QLawVVe>SjzFT&GbOG> zgCmeA^h{SM(clOq3O!SqN;EhEi9*jbml6$*K%&t56<90L;0PoNEy4Ih6l>&;wI>QK zp#p`$5l9qzUYjY=;0PoNJ+IW2XmA7)g`U^VLm~{0K%&sI6jF%>M<7w?Stg}KgCmeA z^j<>IN;EhEi9$;;{t|`35lF1PXKASt4URyf(6j7Ji3Ud?QRrEcu0(?)kSO#l*HEIt z5l9qzmU1f5;0PoNJkg!%CEDN zS@F91D%>^rSe)EkyleNfPVL<9{-(RUtEV(=&T;p5^_7Z;o~#S5$}7EUerH>e?N)m= zTd9-0s?HrJ^(^_&?ElT}Zk}77PMkj7kKvQt3~i2AgIl{V&3&Af+Z3OB&cs|deth2d zIXm{KFNLM>+|&Y{%>W5$MG8H{onM|uEa^+Mt@a)_B(ie tE^lq->w0}Zck=q)a{v8+^~ql49oAEy6;I7WZ|0)YZk?S6PGndxS-+;6gk3H+fXe3#4ocS z%x(cxkeT0eUYum!%gfAMeE9TAR(bbacAx)KeJK%y}Eaq}S&21g)K7`+uzi3Ud?Q5d~VN{I$XAW;}= z3&l{P!4XIlh7|W-qA)lDiTN76wN!})M<7ucz3ohi21g)K7`-K3i3Ud?Q5d~lLx~1Q zAW;~-l~aiZM<7ucz0FIB21g*}>c@?Ire83h$jy4o&CRTV*KC^SyU@PMKJWZI+nE`U z>`}QhpsUxb`yRB1c0A?QG^_tHel=XrIcM!QGi$4f!!~SmW-nHzD*w=LT9)8L7t@QC2a2of!x!Yyw6=j}1XD`e#@%_*HlQp|! z@VR?1f8S?MuGu5&`H!sG{ED636SIAmbNgit zdL*|7J|8Ve{{+ov###5*X*&%k=Xx!Gxrk(N2bC6 literal 0 HcmV?d00001 diff --git a/7feux.bmp b/7feux.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5d8ea6dfc65296affd96b4f7059fdf373c9bfbe8 GIT binary patch literal 5082 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

b8QYjNhcp)=)`!OR&!A>Z@^n|IC;dr?sgUe(B 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

YptU0}ZkIV;# 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 _VW%Hx=#Q4w?*+0o5vrOb=ykk{R&+tOliqz>_ zByAsoS=TpG*X=XyHS=?H0W0Y)dsPg9&{CNs5hsMqI;DIHe=YHM)dRkZa zb`dS7@ftp3KPj!w#kfr*06kZlH2YKBzL!zomuMV`F>HJ&CN+*^JVAAgsGkTkPR{kI zq4d?N%zyG5%on;qn5o=0$NZotA(;Vu3vm&Mzg6zCh-6swqF?jMk>q{C%%bIyrYCLp zwj1nt?VT0Wn`6BBwoL3U4f81%akWXm%!{@?z~|~IYTbN3F?e)J!)d>2(_bYOd}-%H zl_88_xS_|{B*{~pw%{5?-Y&D(a1shXl&O#FWBxc+D)+Ao&J_nr<^HXc zWlTAne?$RUyR|OOR9q$_zdq`m)UNfpDN_JmYo9Cv9!x>kR{ z)||@Fz(&&O;l~~j0Ep9<cR&fglw-l+eIW)0=`Y_GL^roG+NMPGyEl=zvYKCN>n`2a61feifrf<;& zOE*wb==RA1wnap=tfIM?3ASkFyX;>SG#3ytqvjfl%%_wf>kq-l{QL9Ok<60FY->%V zT+%h+PPAC7Wp%YV*o47cB};y^YF5*C`3N&}%mO_4zR(g#4hQZV2MG|Ty^%#8n?pq|wlTajcxAZ?R@)GIn4GveOi&qY4a}gKC+o#P}|`MLH{8sw{_&0U3Gf zF8?(g>JelJYBc?Gq$03Q?wNv$?v}a8CvxpI`ObJGYiXsu?~L~Q*KVV6codTDkl=u} zBalvHn9$~dR{@lbOzAH_*G?Azk4TBhR!uk{G<_F!h4l_(9<}AE8eEn`f+P$fLkjLh zy`G}5i9zY;-=TjrQm4& ztR``T=BEp_5fy%%gf4YI3T@rDif#l?z~en@P+UX-VucqJr*P6*(1H~nQrSOHq81_B zWti%{f$#XG95Q5k-x%)c-p8mVHFg>85Oda%lyfsD9vz%@M-#2i_xzjQzm+mwAJ8bK5UC^Wm|IZ_!@M0GF=wv3STV z&BvFIKq#>cB=4$;?Fuvn0BNY{7kp|#or8sXNGuU_lticzIy#x{VLiTe>w(+t;R#vKm}Usi zFhkgk-xCha<8O=frXDjwqW0s*z>qkjz^ZfCR(aQ*`8+T7ntD${TX2$%BYpK=cH{Ky z$l^{;nAA&otLo8mYNx}X$2Xugj+!COcj@9g6t%*}FT=-I*p0ckYUY9O&yVoP$9|K? zG*kyXydLe3={mqtcW)&Z`lHu;)?V^z7lkEy6EL|{G_-1#bG4M|>t-y_Abqzy;r4su zTK>S*mt`Q)r|0Qqk-)}pxP!*-@(W59FKz8gfkyy#H}FRInVA)Z&Sh5gb2ElZsY1)q zHlgdp7YMT--z2prCTN&&%6ZV)7?D^(iJrXWMN_tABBIaT@kJeZ#-RD!gwa7WT1C@z zskU8G+W3SHtY1w7bf3vSw`$izV}2wy(1`#5t;Os{85;j8UlOmW9=5Ye97M&~0(H#n zl#j-rqtd#h`Du~d!*<_{u}tOmqG)3g3bexb>NCjO@tJyw@sKF z%OgsZ=sec*(3CM7P7HA&Qpgw(Phc|1h}*qT;5(PVT9OY$gjO}_OAV=2?9B3_nc}LM z29EZ1QY^3-7&hro0|%uQ2llk;ko6IPf-E)ckZ*V?uwIPLR@l2E5AyT`HV9Pe*}{#H zb@GW+zD&#m{0BE2Y~r9M-MA!j1CzBdicanVaK+u{kD<<~WIFcfAJ1K#iq3|~#X((K;F?sSf=!|W%F+ko- z=9~W}AjjnRYk?GK43K^S@&|khkUMz-WV^%yBq^FK1E}?U;a&kY>F;onDYSpv-vsBF z9DgmG0+4|-C~yiJ5jg*qCvYYuc21S#FaMi>9Fya(1yZ1)o>_|kB36^! z7};t9G^0fVnNMT`W4NACr}+XZ$0oHtvW{d7?=TGEL zlyYAY52w67uwKXwxsEyWA(>N?<-+lN>Fc?56O?)FJ;w<3a78?FIdco_jJrd8iVFt9 zSK|(fWU`GA)bDbarnw1tq2Y|O*C2;~d`_-NBU#|A_ zh|6imgFCyw=5`$B0KG#&Ic=1a{`7~%&bXM^vvY|OFpo<=b>C_I8uqZFTr*qS zT5%+P6^c;PiG@Q|FxrW`hfeZUvwR_EZ=+;#C_&Pogl^^EBD1Y7nRuHd-2qwdG3(ll2N$WG8e3wfF{E{B+*NsEbwOeLgcuX-7h?jk0@!|t3S=8&G0x64 z$N)8%6Qnk7ro6+K!?A6&ZgTj}KnZ^2JnvZCX!y9vC@3NlZPn1}RgVUcX08gV#d%r$ z6}}zakAsXsNg8V?EDM>>rQicVFdK{y%T`Bq5SY|XfluI%`*VtNIN0(*xX_E@AH&t> z$pz0@V$~Nm$!$f@q9!}Gx~!WoWT@eHelafTA-yF^AD(yC1hqHsD^z*?$!|5*upL+4 zkUH==8B>DJnFrnTc(RrYk{`caWkFq$Bv?=%*tVciH`zy@=tD#3;J}mEv4 zImbvAE90PE!0E*UqTKy5-ih%s;PVImLaQ0Rs8J#n4S|Y=OF4_n1x6`v!~aU(g{T>f z6>F^;C26~N397k@AQ4#o=?3}!(P#81lvTsc3XW1)F|T3VyoOL(uC>c-rs1@KNHZ>E7GMN$ z>li@{*s_|M)bGD0HTb(HFbifzwaQF%OCwF4W@8z8cD>HD%_65$c>|-@DP7Kdr+Fsl z&-7jhh7iL_yQ)xSH$?A|v`un>3C!kRP2(7yF!B#$t%&v?TM3To$%Wv#);_z#55I(k zrtkxzIIdh#Bq!7M3p>C?&S2&OIb|lN&5UD$C2|&SL8NI91H9}8^?j*}N((9bxLUlN zV_K`Q;yo_@a;AO?r#0I4XSI7xy6~C<7H)s`!w8QrN(!?%Kmmr?5CjvfKK`ky<&=oY z6cxCQ;kxvpOzsFnG(H!Y8XTW^&I1>`)8611KYHBjp5>UFS~gB#aF8>^5<_gR9?jD- zP6EFo>+?jK7Z$x2$dmq7LC{Tt5!%57G^D(n#F*%=dTuBlT77=|lycbkhUZ&+ZN6CL zhUeE3ddKS=8qDDuMjTq!VELoBcd%SqDAN%*j3fB=+%G)ND@)tcNt|Nxzw1=oh0QbAP z^xC1d2X4C2SS{UoB!ZB9c$6 zH^Z2h3rxDbdb;dPH_}o}!Pt^(Kfj!lk60yQE_#V|gi(*p5g|gjcNN%g=5ENWz5)_hKs!{z=8Wj z?{ZfE9L>@e0CU6Mll1-oi^zfLbgGCcm=IyI)Gwyq=6EEAXU7x>}ar1=mN6JZR*OW2`QGD{-HxGQB z5*3?-Ux}O?aP3J{O3n3;ejPCP-%?D_+}1_zkTZqZ%O}v-YuT5c)?I#he!eRt_y&3j zkKPsuCh|m+qGMwcE3o(mo)A#}!+Kt}))Iv}#pO(2e(oKz*B0ci#!<#$@5knP2EI!| z-t#Ww{T|8m6z4GjBQcXRB$7Rp_>{?bq0Wfwjl(<1s4=I3OD`g*f&6&JCnKl8H$0#C zEUzI^pFE$45PbuXxsfstx8=IghzfaaC6kcpE##6(6RUWD`rCNKJc(O))OZp%@>tHzQ#{aU*SvyLiQFDs zn|XWd9#z$kavX)9s(k$$)4$8*S4l1UWo!1OBm2_F3*yFrO>e*A>6z49H~dO0zo#`{+;vGGcZveL5xu^|EzVTmP7 z@_Y@}jZ+%y$v(EQ@*6G3oR@H-rbv;g9e=xxEG;Ol3Q^0&!r^bu7If>f_a^JC+PzS%}4WpM@yX+*jCqjFvmihm*6uAC;XNy3g>W*74JInHU7QXCk>Cizb)MU$I zob4~{b+&Akpz3}LZy~xHcrWC=V!4a`Om&yt+~o<}H-(Nj-7j)CM(Tbxaqwt>zk_L3 ztxxYyF46b;F0dO>oK?s+W};MXlTFN)YFt>d{ztpxu97+oZP2 zoVLo`wo0q5(%V)!uB~!>Tjd1KSr62M9#k;(LDfs6Usm-#Oz#@=9D1%kZ=~mRNA_5! z&((RVB7_kIexKgL@3d7Bwr~Yr?=Nf&|Nq+)s`&t&(Rq4Y>mQ_{;;ix_A;RVZ^vxN; z*G-^vB>Br{2IF&$K2wPUV}dVfyKcO=5=k7ede02ThacT32a-mr#6M}}IJ#3jX;$}* z;9L-1iO4D8^z=wL=+;pde%!>n0=<4V2Vu>vdB!s2R^$#Na*SIC1&Mo&UR7Fyu%Fx@ z(cST5!XoVEW8T2}pVEsf>@|?XmwCV}X7MQUB(CI9<4Ih>11`b-x86|??BT+N{=l}W zEQuYgKJuNKm{YTS;Cf0iaVjCvfjw3E=(*qla0Eu71m4>rz=*?-@Yn zCF$pNob{}X`}a@2oGkuz=byZVCvg{Goy1ANvv@o#e9lSWWMC+;XK}rT;Ql@-jiZHo z7PE$<`1`l&0P4f=PXZP$XHm#k(0t{K+YZ>}(NC!0``W zkKg%tCSyIvAuSD{1yth;p9MMzJE7h>*{cII*taGI_a5i;)T>_W*;^CGe;cL{8jw=& z1Aej?;C;c3Wyo^?P7is`uJx#^kQeljkLw}-Wj*A-pa=U*J=j032m2>g z(B6w@hHG59O*B+YMc7EH^oVKO8ZA&c~IL^K- zPn|x=A&rMz_Bh^pMUJ`S%ak6glO9twVNvMdA&Y)zJ0GnAxAlSIzq&7^YK!{D7d}J1 zrZ0L;Ul@RHtsCi!XKt-CeesNp#nYM-!?k_Fly8F519IK4)r)=)57nKgr;oCLONfwB z+IMywV|4+ZgwZwh>28vY?@c#MQby$hR0;GKCvoV*v5_)rLz6(Jc52hZsAa%yypE1@ zmyqVnrQP+&*#q`OGX4n51F-kF9;v6s2lUBw&e;XlcSGm)DZC&)$;%4+PKItF55{bS z2V?f5JnFfHC9vm0JX8j@UBay8Y$V5+&;UIY*mG^Y__4%Y@wT7z5r6ADe@=0K z$ewGNKOfpE0WW?2Vu<@4NwVkKqQJJBmf!kP`R^GiZcvb*e3>AvLYex&ww@@72GycU z4MNzbC(G8;B`(vVy0!_q+Oom-dr-Bw_q zaVGTmIRa;+4Pa4qT zFuytb?T?zrB|JPUy6t@VlovVSnHMRwd_(4giQkixk!K|4z~Fc*b+-KgVlCk9K#R69BcSmW} zWOU*|gWp;~ZZ*p+RNic3vELBPBKH>R9E)5uO+Nc6(KPwArs+~)l6u5*@WjegE?)_PKc#z3U9Hyw*?#+yv=|lShBq|sf@23@ z%21gpgZx)l2Oj%8a?V_xm;*^9z9u_bpZGvxD1L%9c+SN4o}GARM|Jyzxo`@vCb+Me ze(;K!v8#{M*BB9Rb=V!_ql1YlsPVixO%vqdZOJxAlariB6z-#MVS`xEn(DjOMDK}e z5rw5UkbHwG&eiC5%wQSQXlaM=Fw>F--Ru!2)pd6Ak(O|ZL+ua}qU?~m^(=fC z$`=)UD5I|@qv)XX1p(e!nH@r-=iJm#Yu8bvHZ}LmxeJq%i@4b9GVSlCn@c&|iR#U< z+*lIL>{x)a0+}7&h4?<0L9PZ7ng9U57_wZX?+(lHM#}6NkzA||f`NNik>*^L-FOIT;^8rv1|n&&sHF_l`ih`Yz3dlR`AJe1qB~g zL96TufSa`w=@TDDPjHkAaOzVU5_wz(=gc=inOMDs*ckCOUwtmb{YlcE(XW&iYM}ZuvgtkG#vs3^tr^-^PQJnqFKUS#P#J)kPU>S&RleN`NpqkIU=0s8LXK ziK)xdr4>vH}&I3Qf8cbGhAA`M0hmED#fNv-}jCuOc^kvbB+jYT3EY* zz^6tBOr0SxlTZ?km3Q0$b4G?4XJ;_-jyF>74j511-aY_2S7n2Q3jqUuP>Yc>U;0Y> zCFMvJFj*D~^tXz0a6iNiryhs(t+2hCuzG5A@Ytuln7Qjjm%53b(kS2kve#7KtI@B6@JZh!(Lmc9@`MJ^;CB*Fz1~O=2v7(n6*__q!WaUOgk5UFtv!g zJ>}`ba}|CZAkV;oE?kZSg;?q{2d!|z3-uNkAzq=jSYYEzVjb{|{1qLN<5+jf=Bp#AiO_9;3u~-K@W_&-T zS2WC4ULPwvU31ezbZUt~m6z9;&}87gd^obE&Y&qn6Q}M5ppv_->EBU-$Z&Hb57}Kq zY>DDM`%-m>mvQ?MFgYT({6g`Ym@}U_+IDvj{8EZ(eMhKhInDJ+d_9 z&(mHuuI(OKAu?Al9^dwTStY`1t0uJFD=S5KcbTt!@kA!P72zb~QC2sc)?-z$X+q3kzn-SK8>F-c_Na1%gt z-vZvdImXk5qr1RIlk%Cu^^oJX*E(Ikb2( zc}~7=zljPg7JV>NHO7A-FB;=N)o;1W z0vrA>{buo&)Ng`uo45AG#F z#(e9{n5(7TKz*&L3yeFBAbOP1aS7%~)2h$Niv~*{GDn}mVQBk3Kgx-vfxCZBqIFl7 z1U77ym%DOq4s7_oe#`xbzy{Git-H(m`@n{~^_%yWM3cBIYcCzwUO66WvBXX`J`7cr zPH3<6jf7yS(q1~Ty>gNc!3-tv*zM=J3#nmQNDYbni??K4Gjg%Dh`{ry!L-BZNV>J6 zLV8KFALa`aCDlJo@<;AxT5GID;$pB`_FHO)ddi6I69-zQd* ztBPPTXIAovv{6^mZnecd;{D$jmq`r!3jghgVUFHHS!M8~4QkU?U~hfBk6aBC?ANC> zT$C=7Gz*ayj@>+97_+Jna(w8dqI=P^6j#SNiyOcRSZvGg#0Ye&xXaP)OWs=cHdc3MtrdEf>5XMz-94i#zLd-&aV(uYJ zqY%2JW!}JstH`z0FG$7Cc9mYtPP71u>3? zH3!S-yP))4&=c6GH3c+X-_-lX_W?Cw+FH3BOy?oNNyFFQ-H(3)YT|BhjvR3g7fTM^#-5+$Wg{8N$E} z7&U0LX-zE_Y@>;7G_g)HnIt?7c_1oSkp#m-pvgo*l8`V284jbgSTD6|wYLv%>uqVZ z%ELk+G(l@C3e_OArj~0@9IR0(gh!e0zxFvZnFO@${qFDgef*f5bM|xXz1LoQ?X}ll z%OR13v+TA${NIJJ`rqkKkhI`vc8?}sl} zIks5w=(fr=0=c{G(C52t9{{YgekN(SPr?}nogKvCAB6_DN|uJJ&*|*X0IH;uJgT$9 z!|7{K(l@z8mByW^``(wgx~J7B`X}jfJ28uVqOVVrrR}Zq&DB@wT=kl$@7CSu`iQ>~ zG$|#KUaMvVrdh`WGjIzN!-5-BNF!MlO1Ad)P&8=XJIbFHog8Eqkji@un4RG&4LeN%yXNV0S#1t21w{wMsZ{ec(#x$0EE3t3u zsozm&)5_LUzmaD_>#5y5SAN#DT3D$`uGP~aiLJW}C@Jt>qH9$jvAy?5*n6CYXs*@5 zK$1-6L$5e2ZrzH;_P@Ya055aF}Nm(OzNR zs(O1*Q7h$&&wzpH;G&qTRa51@zF@o}1e0(TxsST@RMv*^3YfbTFjo9F4xbcDW3rRc z9%NmLmcd$3o*J2+3WR3Srg*(972hYxNE+41nDEH$hbsL&97H@JT?F}|?aQTtnL>`N z-9zi?c7mFccgiS*Ygiew* zE7karFETjQ*}@@as1JZ1M*ljkgSB^hbGK>$6qtrG4< z?n%l5v{iUprVuom`-K-^W)4N_mx5}A=}PoWFVRAU8C`|;A57tTQlaBHC<4ZeW=`T7 z*Q7hyUTX51eJD7ysDQ)Pz)5%G(XPUbKA$9;DG$msZUf@mqT{ql4L>5;d$R(6OU?VR zDN+A@+e`kdcg!jg3e^KV4bH&HQT54N73cn?)>D6zuq)XS)qi%YllSl?JEU4OvEN}O zNZKLwwVqO(;_zU7dT{ccV5^y`act|U56HT5bnv;2GJAsSHwxn@)5L)sPS8F$Jxz#! zV0eXDjIMxfNW#8jtf0|WLBlCQ3Ocs{$9%<=AH+-DEu5rmD77Y+Wr`Uss3( zz1+~kr}V|vG{M7xa1pLZxXf9(9OY&<++lg)9yCMZ!f&`c|goHv!5 zQv`C?q#~`{_#YfR1@^dalpsW^=5^H1Q>~1nJ~_>tO(U$5qz&qB@YmCJNRILKh^p?r zQVN}675K1OU|wHLKs!)c>U86qMBj=BwzN{iBA_*yT(&djpe3 zxM>IUv@VaMzk-S3ab{M^!@Y<{aA~UKHg(OW%a&g(+67jmR_h;O=Rrt#sx+t~RrnRP zO0^wtObVQ}H;z%UN?f|siV976wn+a_OfwIMEQ<}(ARAq|cJr2QJ8_RQ(0=Vs8BSb5 zwzaQJQvGvdWF^EeX^T7pP3Y}AO)Id3NW~X{eDi|#NdCTyyN z{Yk=pr^03ucD;oCY#3pW^CwhMOW5ZLqjhSnogw(}3D^)=;n5Vnm9l!#_cDX9t=Q$w zkrt?K-Zojbplum3zMEaGZmObJGGDsazYXsq&Rk+CA0xNPH z%_&_0d8ZGobXz2T|?cgL%z-h-o2Fe>otZ@*)Dh z1cBDhi;S;cHZE`~>ApK)a=$#YL~G_(!mpg)Y<{);>iMaWHN0f%P@IL4JMen7dX)l= z&#BiWdA(R(vtKt{@>Hw9aNcA-3$2@>fAlH69<0x&r}S6Iz=Tjb6M?fyt_S8Z2$9TR zbpz18+e@@Qo?pDRMBBoz{I(Kp1YunP$tAtk<;|4`HW-zt)(rEgTR9L3iIQ`+*OBlu z_vwl*RgaZZcooTsi^VQYgxQc66=mftl?5LcD=<+~exSWlmg|yp6Ao0Nic6Bwmof{_ zO*&Aff+nsVQD{Wu9BqdTKkbl5Tsx=)Sh^H)3X3x>Q8A-R}0l8fTW9~3e57iXU^X36uoX)wi?{HhuPnJg_UQfU@f%7G~#x7a)C**G+VhcVYv_K>_Ykt6stL?A+6-Zodf8=cet0<-# zI*j*ZUFlwsv_M;sIIt&QYKGoKXo9&63CfWCmUAMgP9j7Bn{p&a;?`k=DOO@!G&IpF zM}>|tLoKsY0!4K+UBUuu*|X~Vt6VmbVq+0jeZLneJJ2}Q84vp8plh&l)sv*Sog7zu#->2MaGjqh#9wF6wJ51#D&IRwS2>glDBk^iH*9m%SML zMRxlwK`$E3U!$|fD&U-?Vc8RfK~axT#kHRGQ%-IIjh0}0R>n2ZD6^xGRhmS8vpLP$7?YYZy* zZzcmM^dML<0W;Q`)^}5vS8WLeQ;olVsB97&-!q>TGoa%$i}Y;pb6D_^7T_&l{}4E7 z7dHv4t$G>;oreWCrc$Cl6PsVr4^w<#Z~T)&Muq?0)IfiYpA}?Y!xv1H%B#r0ZmD^* zTb6Rw-!W8jgqMR0cl+yAXDTupw`&T|iXq*Y?Bm#YRk(Tq>Nfhuqm;!-CkX^mWnRUP zpgF>6QlA=<;=E@iL*1`q1v2L>njLK9*>)izmsWV005E;xY! zef`6RF>FGmv7e!_{!0S=cYhK(cYt0~9r_kk{w=9`KwdaP2ty6l;pZ#zW-;*rpCf|V z_oEDvxzG%%kd4y6Qz1T&^i8V13bj?$*Q$@{X-ckvOyCo@CaSvz(WOle)rnU3L@AbA z?SFw$QM4>Jffl9WETY3`zf$rTKLqzw{NAzZd+S#unQTe0nrO*n=?jGu;jw}3Jt{`F z!QU-_*ojZsmn$TTEM*BRM+Uab=0!uY81uN>VU&H=s$??gLk=TZ9!lIHJ8To~F-jIP zgB?BR8ye;!O6?7opbcUv)<+d(6~aIeWYAgX*&r(i?3B6#7JyFeFn*($AX->^g$N&MQe&UwJ~{z95Qkk6XPAQMteyA&Ais!h<2|j zi}cFP?9-mcaNyT1B(~Hdw#mT&;>JoU!7pm^wgBHaB36^E)0i!wya~(jj@_1;X`E$A z6x#-(Z$L5Q}06vuLyPv7;P!`LsYr~0y*v6}#8j@2$ubab_~P?H+B zF6fpe(iE9Otc?feN=M(V>bF)fjzF#ft^BKXjzcI+xAFor*S{^ zX1}i_U$Xsw-HVfT+k1i2Z2v=57m#4NKq}{T#%FkoCJdTqzMR2vG-xCV@Jfk`e7F`2 zm5e5V0}q4ZKm=E6lBkDeT&W1)W3adD0f9xpiM7t!({B?N3LN+|$xVrHhw*pb^^FQ* zaE}jRYK2klCZX^p@XvY&HcbM%9mZb1TUTU6K$exmTUQ`niTNSEilSL3Bt*@@F?vM~ zB^0X?GI(3B-dI75Rnbz7alBz?sooR*f(|7y(j*37iyboRGn|G)eG4f&i`WzIH-9(kMx}u}^)7N9tildR&OHlkDhvZa+qX@KpV)fOwJd69RR#v1g=3 zr|uPj?YYu%4d}fFwtM8&@3Llm!!TA=98=-p4y)W9#v*e2FrAe5Q>nG_r=}GSA}XX< zK%3%Z>TSo`M2s-;qr&9c-^gMDrrMA5`p7?cvJXg=)9Th%?!}xSy_R$b(78bJ`r#%)6xUmU*Q|(mVDPS zPXp#<7xjIRZ!bA>x7|!^kSp8lU&p@~yDYk*DHaQM_X}upV zP#WH5?lElL5>^fiG^ZsrCuYAN&EBiDDAU^B_orsRuecG}`AbKr6Y=P>HEP>S1XKH1 za4LLV6!AxG+ieCXO7P{BGHP498PZ4Bhn?GYnO|aG(>y$9{V@H&OUK9_&{`N}`CBh} z?ukvf+pTK!ullcv&ajKE`PFa(JGvR-OJW865uTv7ZA?i57D&LQ(db!x#YIl#Gj94l zE)=>fJx@_GKgXqpQ&0xtstawytuR3^#eioYyzL<2#v5phC|aWTtHDLnx`QC-?0rSZ zb^XI}o(X9Jbodn)V zd4gojBX%8IGbqkHB~_AC#b9-56BdZX-o8jZ97PM27~j4~iSga)k$QB#e5GZQL}UQz ziY_WfZv_{&ut3CxEv{|lYR%DWTOz@b>P#99Ek7Kk?rl(%TPgqZ2DH;SVYeP7;g z&LK=*SdkrA4TYoTp@9fBq58rJD5jN)|A`=`D{zE7;13c?+1|*TiRE+kV)k{-quD5| z#BifiTF~qqxDqsmlxp_sQbOJ|N3%m$h2d=TOa~N|~*o2aa`)*EYScs&&tnzk^Uaen7Cc z5_fcn6FsT0s+^GMoub$xd%p*tCIEp96F^<79S+h5?oYeP|CO#aJw!>Jp;?)wY|V;L zLcB0L(k1S%BJ7dy*yd^c5avSNS;;HTZG0ze-XeWOa>7_SxmS=89szQ>C7E1qB`|MV zE@!T=DN=Ut&qN%+>~ja@x< z#Vz{D)HoEg13iU^QT&O> z7|=3T=!*bL-{BjWI|YnYsjZum*b!bD$kQwjhUY+JX)UIP?A!J3m6eh*9g3fK{>sBw zh$Jg8PQDVU`SWdV;O>(L-AlQyu5h95TNXNrhM_iLfAxW?ETjvlVqmQ z#m?~M(k-ToCppS7QC3Rivbc1*H4P4ivk+s*XQE@GIS#k(DMcQt z*gv&LuF}=%7d|WR(F3KF9eP&SRJ}BV8?wkq@ooB=o*0^B4+ezOgbTe?zuu#N5NgCt z9=~0GO|-4>1ivQh(=K~nV&k9n!qi|u7+HN%T2RlIm%{X5z#}i^89~K^h8IJg?dOw| zs~Kv_l_uu~b+gXUM#Vah2{~K1yz2on8@7Q&l#}PpZR|B=Hc}-tDj+r91gOD{Qe{vV zo_CI0N8|-=+l8sjuAMwD9GWdbrndFJfuV(9wE?O1yY`-7i8$) zaGp4>??zcA5qelqO1^-TIEfB!l#`ua7k_lsZ>%QBb?jKllr>NhCAD9OBTHtZ75#^* z3tj&4pM)+e;M8Jbk?RdASb>V1Q>x599tucfV1#-f66hc=DdPFJAV)871`Bfa>3IIx z7o0A>4GMC0_1J<1;^07Eo^#@a)r78KL6O8}=*x5C155Sg`MPSDtxL`}GA+@=NU4V< zAbf$YV2G$R!RK^ox!x7%k^}c6#bCWX?^)?`*ZLaSRjWf$x+CqxPo-ry%AT!}qjw${ zJ0zWwb_#Cl&k8=WM+z7Tbz?9yLu9FI^+!BRqavIm%QmaS_?%*YpCLkP$YA;3FpG?= zPQ2Zz-V`UgwoKm9RM0n6oADc;BM0AWYgJ63IX$5{SskXb*BTItjW*wvWOlSAM)9Yx zq!l}R_fi5z%*n6yzNktwegGE>Q0nTNwWAvo-Opi>aWknfLT<8LvAV4-ge8Wf#^4NR zcrnT-tZ!PRm`$R_sYXz@DTBEr!iCUHNv6klJ6$HKMiU$vDQD|$r!fUu1&9Yk^^2aHE+`;LoSh24k-c?|qvg~}GA(5?e z6-^{2F&plJrs4S*w|CTIlh+ZdNW*40t`D8l7a&KKIUt5;s?K0}SQ0f%Bn1mhoCH5r z*>buDBd!rgmsjSq7QRBl{Fp_?7_l@{Ea-Zj5w8Q&@Oh62?^w5<23c++MK=VPI@o)D z#05!nkUS(pH7Fnec4&2#X0ccklC^s!# zJl@D1hXKcgoyy@63&Q@`9l> z3x36PY{a~DpZ<2@!L%3KtD$XgxO4RhwH13b~bBz*FRHBVS zwkU#zUHU4_RUb=8BvHb&oU4kn0?pX$xruyvY75hplN|}M1Hr7WwPoP4ZXZTqrse1r z>Bf~1;1aPx*7AI*^`j&#Mf`@Z+DmeJH|ny$v=NQ%Z*<1u3>t1ySdAXj1{p-eh1lup zy-T_rlUukAO?3r+P6RR>>HW!8@Au{T`lR>!%--+Qz0&)AcqOIxkI?~m29WOW*Eg%~ z7Y_?(VA%62vKq>m15=NNuEl!6b;?IMiQou zN(jo^DgZVgieNh!V_d4dTnvY={Ix*p>r23+dS60C&Q;#5aEaJZbG7}K0z4;ga(>fw zFnjgXc$8Ya`CPa@qnD>s{^T5E3TuHBipr$GsLDJ2?Y zG}ml;e@xy`>g{r|M$BK>g@NG}ig4m5M~M5*32rm(753U(TM=h~zkMP5?WhXq`^#p? zXmXjT+*mvuB-}$qdEIE%!EiT!K9oOG&)*TeA(X#~i}FqnyrrMh>@VZUAe@84QZ~0`Yw4j7fxZ&@T!Gq}RH%+T|z}ZI4ez2eW+TqxaI5Km<@~W}tIy+qMV4KW%Lewm!d}ZBMNt6_oYXf6 zS1Mi}ow8kTmF9|995-T90yBDlCg~95fS90~x8R9B8P5SfAagLSqN>eja?c9+!yN>G%U+1x;~RAxe^ zKIM@#ecyO_+a<1Rx4jPMN{aA>D#bnz38>Ix?p^46r$1j*D! zCPtScLzR!DvK^4hZ?Nt4%+qhur#zT8FL=FV#Cni8fK6qhj1yxY;wLU0-6q%i%RvPK z#2Zo;Fw^ORdq9dqq~CzzA>^?PjLD=c6@xM4%?KjLrsH73*_4W-CAr3^Zm7D}h$@ca zaS6^~2SH&Ou7`YtMv5I2rp{-!Ff5!>lYd zjMq4-v|}e#{KWx42uqfDrt2LkLMic-S%9NX@lWE`CpkN}ZkGNA7$Mn>CHp`nun`*DH&36`BJa(kKq8N6csQ?b_0!RPG8RL(yDx8qn32M>q)cQPqKSyfsB||I`HyZSR=wvwUf8}IYwS(>%;$%22o?yf|8CKVN=`VyM zLO3QeMy8Wtq5Dd%ImpSdlXx>rfl!gClVQd$Qm81&>zt-ol*Du&9NnA7{IM;=A6x&{ zS_TgO20Mj^7~S9+wcdzdhrZ?#&0oQ=%P8F8k)dDafy$bW)}DPO!gj-SwDx25-ig~S z#U%)%F6(%z>6#tBCxCDEVnH+e%J%SAvSY^dty%`e;aOpUp<1dm6enpyv0N>O67HJ+vOa~S&N2VxVk|WT*NVpM{FlFc z8CNcMX)P+mAtApzfIMrh=9KsBpQ?8^g}%J&&#u;8k(DiyHB};Cdss!HP(m?b^`5S2 zg&Y91oF~(CuaQugRm_8)Q5z>VuTDMno3i_z zXxC@6zJEu@DbDQ<)L-@V?Gc}o%k52lnA#3bJ)$iA_Q9IF0&6Kq7WZ{!iP+C6O<0!} zoP8|NZqw5r!N{lWu?MBSw#Rm8G!jojyH2~;enx-n5oxCtPb(#!w&_hr%=m{Nkx$#h z4{Ed$=3m}uBer9AopOsu7W|#`;0q-pzIYTItCm4qB5aC+vW>GgMV39#z#irE$J}ua z>IWly$GM&0{H8Sa^}H&h-jjW(aNW#AT14AsCIn~q@l2z2*ha@Qj^5O#r#~UU(?-4N zsMSnq!`K4y*R=!D^2cM)s4?mOgfTICM+p-B8)E`EYKWYJh6r=oeV7OjPCXo~>e2V( z+DZ9ZGF*Y5siE2_II_-NuGEii9se3bSDG+=tAyS@{$Yhv-?H~ccVz^VkmW_#S=irbL%xgMRKWg3OC2P|>wuXMb>OPXuc!Q!u4im$TKE^|z znJXTkWNI7>b6r*(A>ow=hdO8SeEm(=vH7HU&Lgj74^G$EH`R~9LT!l{!?lV(R`<6E z_l*!An3)=X3oL*kb^dGs{0)}AkDM(t1>$xz$fy(<=^ECvjtz`=T&aI#DUNySE|))9 zVIS5#6Y!B|-Zz%DQ3;s61l#;KT1UUJ;0XlV{Z|eRzEBF`?8H1Mj;3ZSjBjk$1FJ#6 zNM`5(y+pHzO0@6sJi{-0eTmk>?*)FGOe9#lGo?9hohFYxZOIFO2cXn>?-oU!u8KuLK%%%%eRu&=;&jf=`OB9E*|qD#v)- zcU9p_>X_Di73*Ms-qbTq8G17Ilx@ELw&Ux{BKRnCd#1G=U)f(Eic(Y0H1CD$pgG)Sam>e zJt9a$@NEw6&$6EB-!UYlL&EBu-#Kws0Q4O_agQM$xT=o4c51mT@H*z~dvxD{6Zae~ z1C)u_M(a1krH9&_V%-S%eGZW|z7k%pPkn_2oI4Fc9|4Dhc;E6J&hs6pFK7RLC~vmW z^aWt1y|xbBzAF25o3ESou*vCqKFjudPa*G($B=&-jaYB%!Tt2qecw6JbYyKp#J3Mp z2W$yA|EfBiS9PH7XV}9}n0ky=P25hXhC1`A`dkmmnie&bM1MqWjp4q-!Nx-gDD_ii z2x%&mERAc9+d5#MZx-<{j!-QjC-Q_taMeQhta~P^Z$%C(B3S+()F(+6q=raaZLgP` zl0vplh*6%DbCj3#4nYKQ{pOHC??Yi)Jdz#FKF*GfPReUIR)3l6`DF>&hl*u^OvFn4 z!N7+Jubp0dNgTzywb94S~rS4-<%}U^>cL zE&!s4xdUXy8iSt5mtJmX`DU@so84D`jR~R!q3ih@Y;U`szdynDHqJ?Ge+nG8Dc5iX zpro0h?o}|K(K(`;atkU79}ejI=4%u;6U^!}a{~gmq&j{A=>3nFhO_&y_#R7$`<7nnAvB z)56L>`$)pKV*P5qkcXSk_(0>8aWsyOk-mgCIKR>LuMl4{PRjTHH7uv{F6V3-_GWY&% zI9<5~&f!NgZAOx)KivQE8fpI{=bdPOISZS@&N9A066 z4dq4Pg%gU|#=3+8*YlU62MwPNCfN3iN1lDI=d+0;!uGKs7ft})8c#Rjs%LhObO3H3 zK&Wo$>g*#)s`35qwK!&B*Kt6o&KvMU@M(fh_i}B9N+?@)0<({vzi2!N{VQcN^ps7h z_x(gl)n6Wu>zD(!*H|=8+=Ks*9_8kws@t|Z1{KsC&zi45)%L{?$sbu$qI4U|fbM#~ zXcKPD0r$Jue=72{)Y>gx#BNdcya8Ea*?)E=X2E;0b>vucwYDV=Jbmg>;uC5Af7lNbtFYHS8Y_y7Z2psC*pes4;AzTJN zW@g7{pjp7!fdWRETkx*rY7&O;rIJ{xEK=cI&^#kUP1~$!Ojq*e4e=F)3%Zi~CG+*B zHsE(oG&?XdmTscIfMc*k3iY$Z#>)MH(=yy!?-`#7I;zah)xC!SPmyjXO z`>$w}imWSG^r&e0*|U#tD@(?oanUBHI;nBHcHZE6AZoCDH7hwGtLOq{@;aV)PLq%6?1mYd)UTK60wT-X(k z4O>K9k0cL%MCUS5(FV5aPy>!xIdn?!;SfjGTsa<9DmN_0p>IoeeJ_nn08*RJ>4izd zG<-`?_KW{_?+j2&Fp(mq7dD34q}qs_N%tWowfV$(J7jS$bkmGeO!P5y0KO(Zg}DmX zbm@shde>|Hw(h*s7{>0vE=RBfWt&4M4sqykz6jQgKqm${(&Tv4cLZq;KAD@2dK!PK zxJjo&iAOkpJO(Tl*Wxz)Sjpk>;66={^=ZZ@_NiBTU;5NIPoL7Ip5U*f*@sl)4_-p& z5=fT>f7L^<=TMtG28ACs!{sq3yxR92Lvg3*N6^X7@Ll~K`A*;bw4$5lL7|#%vP59s!-;XMSmr*Q>pm59^M^zCqZasV5f(8t-++X zesp~78Q-J68+fUFl9y`~AyyIE_xb)T5l{1?4k%OguC0bG+DIXO+&fiQBPht>`6201 zWpdbgfkHtZLKT_R>JB}0j7lL{&fdp)fhvhKAA1(~SWYo392JG^8~W1J@GyO8TChGx z70nhmY92?7xXa}*xzexf^aL88oh3xQYpWgVYWBT|jJ06Vv$JX?j9nJ5WrmkK?SVbc z@R(5Lvs3inmy@5vFXKf-mlhp!%bAALu0PaA4N6e{kTR^&&P?*=1}m@+LZc?9q1mMW z#~#u!5}a>NE)7_R-%6*?n*r#i(Q)+4G8D~30;<+|eH3~{da)Q-V&F_2qAL9)ckLFY zbA>aOew>va^(C!gvHq$OzwhrUwSBNvin^k2{O|U^JEA@<@DE4hME$H@;ocQ-N4)OV zzlsP@?^>G}nVi}n_h#lZ4X{r@C|Bz$Bu!_c7LA-jB(6#DX+uFxF9hq;f(v7|HudhU zT$R+et&|eEM@d>!@hdG@f$gjcv6hH-SP$HOT~lKQf~U)cwu znR4#Kr29~RE3lIGjKxILg{~bJn3p)ZjN{BDFJpXPSk?@)4|Chv@2%ucZ$j~F{SBuB zXGb-k(>FSf=kU5Cx8Rln8wyrV*+u8_{R2v5Y*6w*eWSudh@4t6c3!3WBj@1$43eu(JqQayXY#4(iyWi=((2N`;c2(9qX2eij2TEHNUX8$NbC;GdY=|Oiu2} z=Y3P~sPTOoWpUq8(H(JSW*_3dfAVYnUetb122PK_r-MwoVS)u}#wpHfda91S z3F8F&7A|}{`GE3t8sqt9GRZu`B0j8#U4K9{N9DlA^-#5RFlX9$2tnBZa~Q-*>!|Po zvw6YdqDXORU|wl*WLlAR=9DH_q52FS{0J7IOz1bMj^lkpzVtv;o5AWx#l%fY!yP*c zk$}c)fy_GI1M2>$^ymuJqZOr${d)k;9*iD=hD z!ragmR3Y8%+L>R-?bTt$y$?%+B28mXyiKfoe?;#(v5%bgaEkd28)he^tvGxSa#-zN znWSyb|^C6Ntg7 z=FGWBW$FN#IMupGxEcM_C!v*F`kKuFx2}F64WR*$1HuU4&cI}`ogLT`ZAKhQ{RiEy zU(7TGJwPlu+#ZZpG7zE4^%>xWgVhE$y-m<;Whr}c?r*quI&UVQX%oE3eqt7b`TPA~ z59#gZqM3krnaonU8eX_ob%RJ1*Stk)TIA_1?oN@^`@iU4-J_Y$S>8J2JZ6%zTI3l zOw``a(X>_ZCJ};2#T*<_E5s*VC{PUF@eVXW@IA6pOay)goKL9Fx6t0tW$XO^f~`@r z@qQ`ke}(_8dosX~s2-f?hN}rs%uTW&9#*GCiBN}ek<@{Ho4`->z&sm7>-zLHQb3S# zv}YRckT|eIEjI(~+yeIk4YMj(GMxKo#ow^X310n7sDAiP#adw_**_|tbn#>GG5SUOocV#=el@axlQJmnJ6$73?* zOqS_4f{Tv42h}?Fa9~dy?;vMmi%4g3WNMeZ7dA?l_H-pI{VrBW3#M=~8%z^ZqwXj> z3-kpZ`XI{F8fM$swvT`u-`~GWYm0(QR{tQeER;#k3(PZTszbW>jc`xL_TJd9P6FXY`kGcpFNc zuKs=#vkf8V4dYK??nXRF$XYOqYA6&p&Zj8CIsP=7YHqnH)Wj_zyX_zPdvdWpV*A6c z2s8WJTBx#0)58>GdowiaajpqIuIb#t-r0G3^^YPId4{f9}<7r`QmXK zU%n~hU&f9k-Z?_4c^u_JEtjQ77-yVkGGeKkE7T`s%bpq6HJf^*i|8HIHTcXf%dl-~ zCv5x%`76DIh{U$xN%OH8G7doZ!PF#TY9CeORl56;R= zKUiq*E==RiE^l|qTiU@wM|WW=Zw`68OWsls7CO5N-Ml&F?Jjw9AGBw7v!UQMLtd-Z z>x6?a0|Yw=&Q$N!>U|vV8H8sZyhOcK^LCq?*Kq_+=pOmXPZ871%FH5U0wGxkZ*!>E zYI#lL)lH~?lEHf_?*gh+kjA?-#jK#3@<#46%kmsdI>1{uie{wokS6C~Qnwi*wMs}n zC1l2G&*dwfm|S9t)O)phFXg?I@SKCUrK;Czd3EwyL}>oO+wAJKT3$In$(Y#ok}I@9 z5IENDt7MSOp8vjjRh^&Fy{cWpRsUynf8Y9G2t3`Zo-|_^1yA?)tq%s`&hAw$W(;F- zXZQE5kN@|>@u({4Q%1x?D<^czh&0)upW(q!$DQeCS>(WNcI zzCR*nafe0s{ZL}lgdP`q&8xu&U0l0+o!~21KX#R8DDry zt(}rP(6|wS!q`EXP%l*0V1h*(2V@GOG#8jP-3VifB7j`s>QK@43HqztoKb6@G1me| zZ0sc3_6K(7%UuZ?ZA_FHRt^@s1b7v5qXe&l=mEAS?-5x}UF-jcF)#%VPT9mfvWHL+ zIAjJVj|)V#?bTUP>z;jZQL@SY5NFt;_c9wNil)fqB00;%h(Szh!Y8|hKvTbL-jT%? z{h|{4JDhqJ{j%CRk)g}@PCPdgw{KG^FHY%BNq}r9Yx>ZtvMz}n3za3vA^p@I*Yno^ zM@qRQ>yT|1P}P|l|gg^NQEKQ1kg7U2k9i~QQ|DR%8}aGk@C5ZO?h$o)Neohw!4(x|w~ zZO4)EwY;bx&>A)?SAWQhruL!MXV>rnI114vgR8nLc?R zw=QAr>T4wjdQ}16VLQb(K4Xa-#n9wXS(D|Q;v&`H;05|L_9l2}Qu35rEE$vYd@`m_ zlrD)-sIdy^(gh-1vc=1m?A*fcFqR8Htql2xueW4Om+BWpY)ZmpCYdpi%FqpqkvWYR@2fQ&B7@;*+SUJ2Q)j1I#mfQ~$w4c_*46>=a?=xMqfSIP#1?aU7T} zlA+|+&X(XVBIgHx}3fwG7!){Wqd_CB3EY=1!vBC)@ubpN8ACdh(xra1C)VS@oE>!~_oTLhL zDpFSo%>Bq0tbrCanw1+`0s&Srmb-c zB}El)K(6*>vrQIGDwIH?W=Fuu-CnZ2)p-XUukW-s(9-{xwHhYdnoKKE2!%%CK< zet|J-prhvK7r1t^kA5*Nf~gi zK&zx=0&Yssml^Sm3)GBDj!ex|{SeqQA#NVA5O~u9dk$Oj7q_%R^##RZ-6POB&=;_a z`W~YNi3{zH>Zrw})reJ6GegZLSXk0kV8t>A_GFr(xwyF)yR+ED4MQe@Hr{s((PH9> z?(E~HT(OvnP6p0e^DrjF0=YzpHPsoh|04U);8`UqLFSyYPbas{%gsS1)Tqb`BW(mBhpy%twLD|CQ{YveG`}B~c4NlICOwLsMaeJsuFo@n121h@|{RY`jUaPPE zRSb?*~hN@m4yM8r9Iey z);)W<@D1)e;I{1Spci}=ApyIBGUIEnsrAfae(+M4TW);O48z>gYOZxa%QQ$YMwQS- zKP@D#@oxfb*D4_bLhAy1BRjR1ABAYBMxf=*a8v+gVlidpXFp(!SI7dgF9ZU$)rXNBU-hGeGImfb?%hidJXA9qf{)zJ9ep z*!EJ>2f>HcYozF5iQOkpef7gCw!P_t-dkt_E%I|?XBdcgd7wW7vdKgc_TvjObrGrv z#*I2#NgY3SBd(!)y5M2lteKYCKDX;^(zAx#y3L!k&fQU0#Fz=_YO55L3?e%(we(@ zsBb7A-*;<~&--W2)%5nr=a*W~Mb@*{dRAM{JFVv|>p9bUR$9+8>p8`GmRipu>*=wc z`PMVndgfTqEbBSJdX7_1Ydo&m7VXPOQVx9?Yk4ja9ldv~F?%0b%+(T|(6NE=Px~kF zqI|!0xkp=@=g}VKw~60l{5J6G&h===_+?%1(VV`DC36?n_Sx&CQO78foe%lyT6r_A+7UmX>57y7+R?pb=o%&&^`-AfrN zzc7t46vjy$$vL zCHLGif3X>$r3?T%qH^FpVYqttE~&0bp19awb9YUhRz2FIz4&5@YDcBp177Wu`o~!H zPg~-jKX17SK;pj+K(y3qN{;?p7WXb;>-hc&znQ$dfnw;GPWT;?Dr-#bdrGvW{3djj zXc@1RXh-*P*CP%dZ0Z-o%64h_*sOek^5h1&-w#{+XEO1MPow=?mit?=Mmo1 zcMOJM7~e(IIc{lzmfBaK=0$C9!8!Ay&nVFHA1u()j}~Y%Lj_vpA4;_LaDirjzd$>~ zZvuH!c{=&!@cskRAO4~z_A~ohsF3t^uJz2fo*tgA%7VM<{dIHZ`b|94+XdF-p~2Fi z%x@InJtVGc_4W-z+SN1U`xU-7P|GZ`|6jLr+?yrZxb70w){)k9inc-ENFE$0pr-K~ z)Pk~|gU98`A>Zryei-xG!+94yg1{NjtS zYbgVySBe2^B1eZ5lcd>8m(=?!iOwN<(Hn!y7^d0Fmelzrw}%y&+WGv0HqCP!zd+MyK!S2<|U-`i^PAhW<|9nGqqMQMMpa zADKULqV~&#r;0!T`i>H0Y}x-RaD;qEj5(`?*ZI0c_vsx<;ab@y61dqq ziMoAN?Mn)1VdiS{VGe3#S7K~rkAt0&L;fNYF7Nr^+R{T-l;1xIxUUItW2rp`*ggxe zy#WENvq=CG>pUHFgY1jsO4}_J1r`1|b^eB>n(&*0U|rY|Wps>_#|K0B)baE5+?EzH zd%rmfnvb zy33f?K*`@^hsj7Ccpk1e`0=Sou*CDE#?rdBWE}p;=XI5&C5k3rNjk5Wu=iVOkGQ_w zzP7}ncdb6;cNxE<%<6}@giYKYr`{zS6fK*tiW$Z(sqZc9GhkRL3)@O9&A6gNk;xvx z%oZkjl)p>|#w$R@BxB)MPH`6QF(Q7z`jKpWi;IjO&6S3u!J+SOdFKpg(614@`cQK+ zuahX=O)Gh z-RZeX3}7MnDNFBtiSV}LuGQT57I9r*8R|mrEwT$X!tJ!I>P)b(s8+s-)jdT>{*7|@ z*s@xi8D{L`S!TR^jJBY2dM3DRLR-Wow&zxE>jN%hmT1~ga{CmlHW@!@74$eW4>Lyd zf@Nh=Xq7WqR>{lSndSTy=%QHA+aSGXoJkUwC!+&vbuDD&+?p3sAWisg&v zmelxV%_>|zZO%P4g!|_%JzpAGnPO=KcXf})c)0IWB>KL=dRMgN7!pq8upSV@lQIwY z!>hkV(TGP7@0Oo&y#SG9R3(Ay1&<@p?^v1Q&n)$iE%nna0mF?&cm50ur*5`|$85HT zM{Q0Fr)*9L58Iq1_V(GvmaC%r<#y1-{%pP44wl( zP|P@DCQbP>zH!jEBYgFsZ)fF%yq^(33~m0Nmgm z=O48rK_+U4F^-7>QEXr59akp8Q+t^)67M(Bgbi3cM2c2f+dR+SqGErJ=NDzglab(` z9KB%ye}OyX#T21rpGSgiGhYIg=^N4XX`&MXk)-CNokA;rVdw5@$Gjbph~cd3kC;{7 zC3$KkPZ4=Ky;o_SUPpouRKYVK)$W?VxLWFyZ`o}wnqTj)SuFJ{ZPu{_{~{q)@-M&9 zABh9$FCS3+0V)1}SUIKm z6}6jRr!XyxMFYi3aT!}7m!#gJwUZ%b%x`KGpSdE$+9vQDBj)vszUb$;P4wiUo-?lFI&_iaz1jWydbugjJwRCAQLK2d%<@z)f-QDM3qsu>Y;v4T3p;o5>k<4y{)2&Uc3vBk(^BL)(GRT57lu`GM1 zej8o(P_ehDKFIdHCH;{WaR{3&6cp&hdXq41Vlw1S>42AH;pJ{fgMn$vAM#HEAA>q# zkuR17Xkr=Q-{L9fpFte5#H}mFJF=i(17NgYZa6AmeT<9#mf3RSADo^F(C@L8H)VEG z!qN!{jNLPg@8V#6o5o(rJ^!^Y+8SayT1?QwpYd!GJSvFnxsvq3fO@p@Nf?dJk5uF;cTub{^tV*gY5aTz9kW+CD>?w(lXA&#t{^STFoDVuzpN%| z2-S;l2WD8O$4%Q+pvP%cEtD>nFX=p|lAX5hu|vknU^lt;FALKd<8pKzWq9Ym8XewF z-)Ysg+#qnR{+tkB;U!=Thw~y6p&`Y{qGNlnFypYmXB<6zGQvU>`gWhpdrI~=O+V9V z5o`ys4{$yBJGvH+X`wbrqWC8n{3|f8qwfuzj5N$OZV^*EzP{F`KDFVwDdg)bgJKS_ zMa_$bqHmS)C#J-$)VS`#Mp|$~**O1VhHP>COYa(uMtSixF4bDk?J)-;w2ZnySXvn>FXIm2)n*cpP_Ae5x}^T-0ACMV|n!N8S-@-A3!TQdf$f|gDuB=h@2vwyIE2gjI z=%X8!;0Al9|AKY)%(dQevQ{ehGe4v6%ynr7N2?&0e{|l<4I_V%tnX8+`d1dPewy~1 zV&ia7d9#)tFK6K#7>BcvH3_{g7OKVp3fFLjH5mR&gn_SJInVBij>7~a66yUVfLckI zGXJ1W)_4ie$P{6`(n&XXyvkL`knzIILTqoaeE!f$FlfBq`s*i**CHD5DdY8eALI4k zkmcBrkuqL4v3zv&-l!taGhTHybMIB-#d@Om1zr+^;hlzD zLWMx$n;VW@w;9{+<*^qVES<*P(Wq;Qg8D%lqkMunOWul&gY+T9j{_wWhr*e?3E=Wm z8f!H4HW9UI{WAHG&hy$M7Z{TOQ!VqNm(WcZdvyQhdAqsP+hP2X6=OBW>}LRgn4?2YzO?y%`HI4cSd%2s$lka zzq*?SV-HQaCt`1R21+Z~5~}KPy-<>3T==dGVvjl1Mo5r3a@v+gsx&!%X5Eod>B4W*S%BVE4*x9y_IF_yych?W921wp1#%*xHa_lxF*B8hY?flvW02cD~7+)f7NACmyq0eL~qI{~H z2dO1D!xZcZUd&(}Pk^&E=j9VHpm%iKP&U(Fpw^j8{pGc#Gh0q3G>lw#p+NLhVP+|P;jAP1PeV-0^7c`Js84G^0{_3x-WBem zI7+)l(XNm;7koA@h5E<({$0ug!;D|bW~z5H)D5Ya+FuQ>ztF1x>&RoH_2*0dN&mF| z`=tH{DLLfLm-@dOPub^Dp45M>sy{2P{=Bjr|COo(FKbzLZmT{krRI`8Se7I7czQ*w zuO5N0$Q&Div_A@~kXPf@&Ht>gejBFLcOa7?uSa100LmNdt1*-(u&yDnqjxo_qJ8zt z1mhpD(&C|B`~tFH`t!=b$z<09e*=jy+LcevS^OIKJ;-klzn}8^Bfn&1`5*Cw?o47X zzeo;-TycR@A{C{#cMx$K5&sz%F)LCr^Y)HTPgVkv!=Pl*J+!Xn04lidz(^ zs8tbC*IgRs%B+a$NX4D1o;uBcQ#8;YsaUE4@7Mfaj0QGFDwav$7GV%H{}?Mgu$r&P z#uolY=`MWhmUVoCj`6H(U_C*RjR?0jHJvOxpAi*ho<%OWwu;S=A}(3(QxPaXQY(X# zHeV2m%mc;o9 z$hpe&X}S80d}MYXA!hjc9ZK%gqRR5jWKQeq-Kc{42+j(UeuFa<6G8?;+*~)U=Dv}07xH)F;(EXAb4JG^qahAL zYVKL$ueo6E!UDg4&fMC{C341GH*e0|nnCrxBHD1rdhf9zS5$BHvA3q!+sfG6Q^@kn zbf;r)qltaxl~=0XD$%~qZ$7`P`F)jN0l&%oNK0GPU#(r`93I) zbIU^|+P6skN&h5XI`@3%)QY+0aSBL1F2rZrCpIb}+tA2P+#2z}wN8_Z8&-K25 zl*fGgHE-8ZjhEk4erj+mc-qZp@hyZ;vBEa&<6|yA`ImaQM9bwD|L;n^%Lw>q=fvG_ z4?ce!*YnBe#E1V}qOB&qoD-LkZVJEXnepJW`66mgsf@=zfiF2ONZ^-a;iNb;Wt=(h zYp0fOepVN>P!y+K6s*$m@`rjrsrMt^l%6D-|A^UFq4da^2PDZ>pH*|-;9Lx0iA({Hdt1_$% znwjCS5>iM%jRHNPSOU^Pl={c-kL9j5bH9pa=HL$dIUOV&HgHxtpN=MxZg%L; z>CleetLH%Q-_tux26%U-C@YuQ@w#BkZtvKP`cy@1t$ZD9Qpa$zF-jWFDVyA&DbLc2 zvm%~c{r4=J`yg({C9ovH;#|E`9qb(=*8o!Mol5>R!+75+%q+u$F=k_xh&GCI%Zwle zpr6Z$UaoQdtyD?{rMb~1^i4->3Ee;;syz6D4r90TR0Ouv-GDnQqm^03WJrd?1;+f_ zJFNZLR?wII!2)e!!%2}HBFmCx@lj^Dg@YZ&)#RO!;9B(zN&TbG?)9guGd{k05Ap|A zz?)@wCZ3J-zAT@ehFhe)vgycTpUkyiR`gEe3SL&XyV`z48hRZ)KSS~zE7&QISZEq61Gc6N!|05pVMz+8G=zZSZXTVW}JGyKQe=wrk|5%y5&nw0~Pd}}#p(vS0py<(;bv`#(YG=w1dQ!rNDBPAb}3;$Whe-RVoJfEUB zNMxigf;08?C_i7u6*cm4#yA0Y)6x6)JE-xHb*^ZyI zuH=bRD^Sk6=Q%i=gbmGqemD2+S4ThS*PeXIb!GoZGj7WKyS`pIrSL{1wSDA?{yXrO z673kj_{hVj!7RPkaj9JCnveqK4y1H2DQ5jbkX=f6OwDhkOY0kyP zgY>Aztti$SZ!6Z;Hx_A6ljm4Vk+zgI$Z=nhHjbaeU!-k`c(oV#ZTWJMc7)%Vlp+nc z653iP@06G7D$?3V7HLQQ#aeAvk@hfo${LEa3HKChIXoYx-f=e;X?rIXY0niEX`4$Z z7kKZS42=Bt)f8)cCNk*v0$*j3R=buu>x#4<^7hpgYx@=yYft~RMBBWuSj(qP)vJJc zb#a_--BNmPDLs>1X?CjKE`66A{gjUN%q-S2wZWY}R-3THtIc5*YN5&LG>LyLEa}<^ zG=>(>tzA-A{|rlV&%9!-orcOkSz`Iu;?#zFi%OR)s)qj*ji5%-9HYVVPfFll%SdgQ z4FANUd=fl!cd@qm8)gEb9Fky^=8y!UHZ-&zrN2ND7n(_x6;?$<6D3>axV4m`ituTmK99oXapJ^=@ zX^x4Dmp1sP)GQv_0c!sML>Fr#rZp^DBZ*qpB>qtO*OI1u$$*cs(v8(d z#nLIrdloe(}tH0?2bt%wEFLmh3Fo1Up%co zLqtdKqpSo`S}oBD9hJslnp*lEx_G@M+VA+uzbp7oWBwjqD`!wehJ}vEgUL;fqKEn! z3=JLj>iPa@^Y1OHxvSysGXy1Q!=}u+t7g$PLID%Cl&S2uefRo{YW#KrqOsRH_^^S3 zbM8gqe9odJcRLBNYtF(3zkkVM-`u(>OYU~ZWyntDBT*YJ#i_dNY;6|-#_-}Lb@zDX zjrc_FHRY8*W+?Tvs z+Lc~y?e$)*`(-rId|pj(h5cYGmEcn5VxM-0HoR)_e40r&fUF|_4D7+|chp%PntFoQ zgoz*>B@~X6)ZtfVIEua7a(M;K^%m(`<0qdx1B2ARt%y)#KCG#Htd)=Ta3AuqPd--i zA)5fnCmm+gk#AczL!*ME+l>E*y|)36vbg$(?|ey!;36WTqOO993dom&Kx}}l1WPCa z>vyXW0vinA9rx@K zkO4Wh{3d#0cLdQ~I%H=d*Phry$Kj9PQ}8LsT~!<@^{Ccz1#3bz_)1}r7Xd9;V z)YoR?p9cuHYf8qW9W_xu)PcheY)D*_3s3(bUZP}n!g>t`tr`Odfo0M80hY*6oG`ahdJVfk^%_A-2_cJ|yVCkx<2ev_u~1grn-l9iEFL}Q2F&pMHv z!VEbkP&gbAJDUl9iSEbfI}3_Ox}qkILcp?4(%lRl7&y;`qXn3yfs3%uW}F)^2NrS? z04@e5OhLGxbrN$xXNi+jg^`l+(r`wpaUS@<;dfTrG=5z8(o0O1Z;8v zE+b&G3owa*EiS-B0=ByV6A0J=fTL89fjAaB0qk$3&YQGLJ_b3p3ARem!|fLEU{{?W zVgVw~wobMdJ(1^jjs{y@Pv%)CntGtx4zfly}w?EGs$5G;8<)(6AeJZb`vibKnY`YBd3TlGBVO`EaWP zz*F57z@{t5NY1p5JfCL`Nsi+wm7&&>7xFA$qU{N>q1MI(lnqdz!>k=I=D|mFH86n> zxAI;>)*kgon~}IPtR;v$#U*At=3J`|F=u#E+08MRL z53@oDp9~$KiaVyE^c*Yq`=DM^v68*E~H!_gI6uZ5H0)^Nm}nyk|j zceXVNai_T?ZWLQ${nlK>o}QFj;#iY**XNfMtynxzocNtL%(6zkHB+4Xrkev+`cqio zK5LdZ{F6SxEKnyVtGZ@d+uxpTZGU~Hg>^9Y>&EXFLhScle!sxrr8R_rcXI03iDqPr zc8C4Ym^qNqfne1%tk*ca6hKZX=9ynN4*Zd8ssq>+8@GHL1IM=x$$>u0Q?v` zCIS2u$v$rD@B3}wQ$fc^*B_M7iX)PVOZEZpV}Nj+06bu{1exo+6JscxEI?e&5OvNN zy5L>7ZXdfG@$M9U@;fiVewJX@CHic|R&4*~rru1}on3|?_cW6qd5>N8C-JF|epvcG zFJsh|IE{b$?I(mLPMm1%;Vf4@=cbUO3d2#fBRIq2MBIc35{UGVW;4ANIRU{FgbbpR z$c)k089LfRw1*hCShC>u*m3FF1iyE}BX{`i-wVIzy4l(fZ19oZ3!bN3n>Ai)FL<16 za*7!?^t{DPlX6&5yfx&ZiUkDb-rtLzsY`tqusytTtO4v)FLsKN5wJa+$bHCt$Y=qU zd9;k|y7I8~D59BBFNO6mbf3oSO?VzwZqazXRmNzy@Fp92-U7OW=b_r)Q1xQFgy*6C zIyR7euJAl1dqiVfkqHnGFAMY5#Qli2BRrCeaGOeE{=%)7Z(u8kqnEw4BTwN*>l}JE zuv0W=y~*5Df;ME=M;&_PvQOjnRyUK~b@Q;H=asfg`8-sYYwW&TyQi>U(%3F(dx-fF z-K(_w>2&E{o?QCkk;tF0cM}rnyRmu7`wL)uY%6x1$t`6ta_7v`+s>*#vq!+Nu-mp@ ze}iQ@8ji@gSdJqZ+>_f`6CK8R2~0U)C!HPQEJaP@)c~lAe|Ri0B>xVma<#Aj91h9* z&2on1Vw+7rL|eNlU$fESuo2DnqwllAXKo#i6JF@1^emQ{^N^jeQ=FmyQIpTsJm&M` znaqdXn3;QX>+X5j|KFSL4!!+^+cUhTxfH07@`;Y^2oJ8vX2+L+NTceh*;gQ?#~hsx z{bM=(nq+S(KgO-1U6{4835;+@yy=SYRPq5tP$e8@#g+_d1f25`)=8%xdl?Fv0W|OQ!!T|+HTpNiW!55KJ4iCaWbGc zU3C1Bk!}WBfz2v#YWVZik?TE9UH%*?ZEcbWyDq+~N%p2R+>PZBDAITXdt{w}BwE4% zrnGao)Ri@1PQ*}G#HH@MKEw8V*0_^bLXiV*yjL||Z%t{c8}AW~mk?XzT#(NSpV^}= z8`aLzJtY;_BgG{kWb3F$ieJ__xMaZ`2G}{c;3kIwi5xt_N_FMn5mpQb#X!1Yzj@?XtFc{jB(|&P@ksL)jqU36lYC!~%8u9At~TST>cNP%+l+^& zPk5Nx@jW`=znjT#`uz>H>Cu|>XAj-@HESBq@NNuz6fOVAir_uJPWd21OUhp5HxK1u z#igqa_dA+BVW4V{4eUPfLAch>c z|Gt6mpWyEW{C#NPr;- z%BfC+`f9G1>Oi2j-Dya2j?~~il7#mz!fo>m9w%1~UR4s_?}&GS!Q-r~!TV|w-UAGq z3WD(2kW+D!cB0B?K$hbDN47=3qh$sa_OB0AIiD*EX``;`3pK@|YV4J&M03%s+gi_+ zX7%;kpsT@dTkDU2Ggs~mV*Rg{kCi$KNAA@p_dq4`kKkZh{V1x;BUBNdV{BKq;pmXg z$+VMpX(#nds7;7}@z}9=JvXT^@Gb(N?X;D~H5Jd?#E588glRi@zhLOJEyL_>Z4g@8txjZV z<*oTj*UK_$kFZC}!ZwHF{`b2azH zsT5qdI)LAOvHg=EI7PwP>(QFG{Eh^Ba}9fI2iWZ4V72--(v!t2kqH*mXC@ZZ%9%3v<4@01vK;oV5wLk5whM5VQ~E%=5Yg;2WI#N$7AyY1_zY8M9D!qR z!UgVwi6_j>4Xi#)!JV+#gjjdCnX&W4=dRKJ zp)+TmA4&}cL)9lGxH^|JpuQ?Ld7H(7^_(AM0zb+b%|2ZiAAtj$tma!U{UlzS-)by4 z7Y6I8#wxGiIB?G=x$x;Gc97Wj4TxsS15e?qkc?rZb|B+oB5on+tPCa!e?xZlqjuy9 zVs$FA-ZBCaS&|~+i)Kp_nXJuN^V$~DnUs_7b84(^3ks%Q!^IZyj7|*nE3)}- z+M0d`GFZ%%Xtrb?J_$46jL~3ANL2@pIco47km03RpTu+>^q;~y=r@6NfaCGH;Ukkc zcgoE#z*dz)e@Sc=HqI3Cv-rXy`*afGljll`W$Q*TbfM3#1hkJmslcqyz(1;+rY6|E zhk>m*D5RQzYBO!@mB}t`9SaIbfsneIMMKjWax&?+%s&`tq_Q6f9HCO+3Gf4fW*T+bj$Y>n zmReTL*47dlCrOmPpk)DC4e3l5;9)Nvc<;T?IY;Om_R`6cR(Oc%DJJr9FwmqwlNovA zK6WyPuzP;bTrzeenhz{Qh=JO`e$t>-(`8ZW1Jo?e4X_WzS6UOUIOtipb)XrK>=zpG zNIR{G)Km#*vkAlcU{_2B2sj$_4&;dJwAFbZ-38AYKO?_N1OJ4;zSyrXMWy{wwz*K~ z9GA`-Gi%Ja@ngn~8#igpto+;=vu2ISoi%I5EJTTYC;KyUb^no$@AJoAOs7ENSWVN+ zH~WEwi)Jhepd%q|#+Bhu+bd%c-b4|o1%n6MS`f`XhYi$e!s|UvIBhSR@C9tU2Qn_? zkBvXq+kCHur(~KhvDthDU7BwynlGVF^Y!WGI|^K=VK{IpvF;XmI%25mcf$nlifkXm&be?%LI7ur0H&i?nfUU$ z;4vD)UvM@Z-Pu#H+R^e)Q+$wR^NDol@b{g zEkBkLIRRI3q_(B=LJoxCcAd?H<;PNe_wkNyq{^#m_(obqL)z0_eBYjc^HCeoZ)D_E z9O}+VYXEasr#@31_#iYL?89QM!#E=siiI%{6mDJcgXr_sYN7yI&>L&bdjfNNwLy%2 zlxpVWRuCf|rGAGVhM;FL#i>j99SD_$n~d%WCvhg(#eg$hiDFc za-g;llni4{Wb7BHyLhCjHgH53i>e<80Pe40>^xx%zM@jIgt104HqtOQ8swbzHCD>o zSlN{&a@jq1jQSEL}^Z$~l`0}GxxZgebT~VYA zbxIEH>(Fog9UMrzhtt!gS|y|$pQ4zpnnTeJRf~~%O%S5*P%FR_L7azmxNg<8q^)BU z?Df9buP#Y&t=lP0OZ<4NY*aUGHQ0qU*5jDNm#*;@T)GfEKH?dK<#C`_-k$ahrcsWr z3mj$7l$>TM5-okDW$Dqzr6Xi5_+u{Gx_mHp28Oz_*M?9yg)oDHB z?-?mWK?^f&UHv0t+$1xZq?HbrH%oVttcWmfgARhqiC)kP01fbf;;#TS&|Q!e3)fe94CVLaE`lc-RG~|~_@+IN9nC(EHa(mZT7?|-{!g{Ala!Io%XkcB?z=?Gk85Zk$tfV zquBmzpPtjX3yYSmC@A*N%Drl;A3>+@WI)K1xZKNtt%`Isp|RqI2GvcZ)5IxlzMotL&;b5GNd3~ zQvcw@1~nh;>jnffBK?EAQq&9+#Bxz^SE`y|f+sMTrbd`x3WMothzVldD!3~{WtdP>JUgZa7b(t3>cV8Wl*^}l3HZPS z{vdS}Dt?3JN5cjGWc6kOexl$De6Tu5I2Gh7+!f`t#V+Wk(-se3Ob@wRZNcxp*pEh{ zP0I8NtbCl)I;Ks|4a}VC_ZKX2+JHSr!oJ>riC?$RX4+3Np1~Hpqh?I#D1V|Y;O06@LBE~NT%Y<0Z3FFx~Tyw_75mcLb(x{ET7so-M zpBK)|3tu059YNr@Os%Dtx6%^k_hdrJ)tFLQNrmyM;Vi5$Ks`djMtF}p=2Xx!s z{v0v4FHvXi>B23czY?4Npr(-)apT>q@jj{(Jn0QqYCKCWB(v$=sPSF^p2O5t8Zpy@ z$TcZs{F4M?sya&}X1H=rRhb&`8#-s<@E=%+fpAXn;I#k{Jq9Yab=vU>NMU( ziHuX!c8xg5gZLedXeAI+)weXF&*YpYy~0wB_}Xt1GF+(f(mi-rYP?4^p2+YLjdzmC zSkoJ-@$LhjBg0gU*x!Trzkin^e=UKSs{RBRWRvB}8TGFbFLQDDn8rKNgST1Z4Rmq1 zR^ttDWt^(Q8t>iTxH!C3BM$T+epw^#O(3SK$$&ZL<5D)PK(p>oYA>MKSmw98aAXwOB7BjfbFBxEtXs?g$xTM0LdF?g;9XTBak; zaz}8}shX!FcqdEhu9WJ)|GF_`3^KZxq%s~lB`ImUFeftX!mUnVaB4ld63AaQ1V^lF z$Po=0Dmy*|=NS!gc=@273`o?^Y-HvvkOz{G-;b96FZ!Bj`3F{bK(xHw3j3qw?^}^G z;D%^)Y<6y zoQ6J3*Riht?dMU!*9^B6Jjp+}tst~w>Ob`lI=6N}7jgIb{allWP96+&WAMuE-5yVI zbq-#AG@BF9R-_Q+w!*i#5V+c0(UpGJm$8cbQ*gKkfBW$Fd;GnIzqjzm9{xd0gSB12 zuOGq-Y8%e4(@@uKgZY(@S&lZ$m2{~up|gqyy79!QuPTgB4oLKxe8qm)CVQ*HIH)%r z`>&sGH%N>PkbXW`QzPIu-FV3}Wg~O2I0CB%80ICTWrO0Qag9m<+b}xY2I6T>9wvN8 zX6qawuLeE(U;c9`-?Ptze3879TIF6f%q6`l3ORB3^JVaECWgXi z^9mC@e|rh`9(s`e3^UbsiNrc^RX75AatOFHyvUCLxo#9@Ih6c99MmfHj2{^ z#X@O2or25&Um&cm10v2pp5ZD8#z%Uzg$wG77IYs%jn@u&b=d2-S~Zo=?B&QSn7MW) z%slQO?!fo7nVpfDeWa+^`%E2Dq=d}?t_MkjkS-TA!59Fcdgce97G3=T_M77)o&%}q zAl$Ibiq)N1g}DjhORSB_o%bDhbb;E5C5vK6A*dz+=LTt-)Eumm>fJF4cre01IK@H0 zeu*wg)rM=wx@vMq-SHZ3EB%`hjxXlFMW&q#f{i1NFe! zt||IraL1#vqXFC(yLcE?g#&EJX3r=H(w-`&y3fnCOL8Fa4i+C|J){Op3Ea$tA`f|X zHD*L@z`^uq%MfI3xImmU<=mbPl4P6@jt3g=DQ`@HeU9u*kUkJyoeSFo>;us-C!`G; zy1__`I0AJ`z?F)SX+8vP+o^QcMp3?|!hnHn6**e0PfP{%^t<)K)D59&GFGgevR_y+=Vv5Mo<%QLk|D>rbOny1q~FdwrXyV%Dmxoz+fc&gPcLoRA~T9I}1t7UsL7qI`!?*paeEwioV5VDA7nTc#J%g!CfAs@YI^ z-Q3~gRn@+%QCV1s^wz_sG zfjWfGX!$#M1)v@$n?yPfAw8s|+re-&G+$*F9A!skQXqUR-G-z~&TmR6U^?t5$m79z zt#XqPt~r%xbx|^Q2w^x~4`3I8hOQ^{R|cAK77$IuCPqADqbmd5PH2S0z0PSOL zhWAsW!<=kX)h}W}ESv0E^al=!f*(kKb|VzzMpt-CQg~-l7}tJVH@4-tQnW&$+!Q*J z!re*XL9YWpTHb1f@w|xU16>V!9*&KooU-a2R4aYE1M{E zi%B)b+3)D~FqoIMf&CTbhgs+Ohv!HVjeP{|o)M9uJxjS7akeH5Nyv0RWV!<~<>*7} zPfd`pF6aVD;SDp?iz(C0$O@Z;TbXtteUB=&pqT_FmuMXMpnZXKM;Yn*uYyGOokoce zq$M)qg}B4;Fkyf$-XYmhS)KkW+fv)mo^ZC1vh%~J83DA8bpIl$nNQCSN5W<6tIk`XNRlBoOu#m2-rjqTLux2OmWV>#bV{F%b8#pX2`hmb- zqve0K!h>}Ykr~?6VfA1l$tEVb#FON2(el61-~X~3#ocF(1&g&o9zSh6ECA#IL=`lx%#Re#PX78XWe!x(v8oG`?&=peKVFl z7+}}PanulKuX+{FDPbtbZ!o5=0(pnxBcxc_3Umy6YtzlFQn&icNnP=Sf!!o?FwnrC zqClfe;G{n*6F9-$n4enTsAq8+kXT)XhrZSZ8l1Ae_=#gxeU-aFA)#am71tf>w`f1h zkInE^RRFK{fikeFTku*TQr9E%n*2IDcb9AX8tAMItgk3vZ$-}Tk>+4!Bd3tqAlpXt z6)Rqwj81fGuHu=E9>_KM`%U&eqD(FnSw;DND>A$<40@1ksm*a*28{owSC!?>!2zxP z*je=MR#s=uv_LZs^<@R#4Zj{Of7gn@D`*z|7gPkc5iK6r-6IdDaw^IjphaK8@CmaS zPPPAL5Ebcl46spidD}wto7lb8?Waa%Vz;$XCFsx~>d<#lxzHhgQ-@LqiVj7mj03YR z(ef7LaT1m`un!AuM!hot(e_w+CREHBOUE#5tgRXVGTyQD6(=Kwz}5GzA--oUeG_BN z+)qug4y}dL#ZC?_h&DN_nOR$v*@OD)C~l3w)g(~Iw2FOjgxh$ewVF};hs3lwuXfSB zy0$942i*#xOL%yX(JKXfY>!v@-p^qCi=qEim-@_cIyxUM9t4GFJ zk}=_GanCgF4E@A(Pn+@Fl?Tw34CqbI{x+gBBwF8NuPw~!s2Mi4-A?8H0uXI0 zQr4VphD2xnL(H?tZ@o^~0z-%f#+e{oaPH_JEjCL4cxp171pz!Q8P4(mo}LV6v7`hu zB6mtY7&Pj6PIOLk1Ws%TGIB>y2(2(lzTPg?IR(Y_j% zvio9*Q&hdOWFmU9WFmU9#0aA#AOGF-;XO5iZA&st(iAo^za!G(s92#-5P9 z*1{WUP^sjjBZIxwmt)6V1oeL_TK*OWB_!#)e=w{&zwXAW;@j|nYOA`@3t)AqzMZz} z*H{#&5s>TzSEu~Wo?)wcACqR2Vn^e#lTZ^*gZU^sr0HQsCWhM;!Q z-AKPsxkt9xp_kzrU`00nwaU3V!Y@5xcM5ZSMjefBWlsc;{r*!>ziX>jLE{{sMx2oz z9bHYO_#kj_dy8U!zcx@U4Y)dm7cx|*a(7R)?Cz2cSf0jc| zIGMJ4i9?1maTW>H1fnX;t)kgnLb4*)g*FLWvQHOr&3P;cL!ml}Xu&7QsC^Q_P^g&^ zRSKW_L`DnNeQI=Am_7_Y!p<4n*6C_{dEqGGM$L<%mQa zQj;ZuA;U{EJ~c0kgck`5FF9UbI1l6HMJ5a*-?aI~@l@7xistTW4|kJ>Ul+oD#L6drnvR4n3WRfRGaV z{#<@@UGdt2Vw@7inK7Ia!>!2$cz0W8z)P52w_5_$Nk7_r^CILg#H(7q-M zfbq;sZfvPAv2q2@ttI8obnI#uEtuo*F%w}2jyE9^-wWj%YnYZf^2)850^|N8f8mOf z!ezJ>wnUD&I&r*b@3xhZ#ke$@=jO2Ux==PJk?xs@TZnqWwX**C{xLmB5Qhg3QLYt0 zi}?#&((})pvk-B~baMNk-XBX{ z^sito#}?z!1OM`ZqEcMo9mD&yxXZf$mu(jpPy-OTN(4@AuuEa`Ag`C=kNNT7xyf(B zRM+8VfF+)~W#^^IUzpHrzs6xh)r=I}_J#N`v|V{m>@9DXEG9ufiIdkRy(|8*^p6Q{#Io@1~79}Fl80uBQ=K;Va+m)Sm16i}W?iB88IXzwjby8}2x)ow*j zl3gvC@qpsEpcAKHu~Wlry2!!tM7b%Y;k>{x?f~vc3y;>Y2zF;3llu!hQp3Y~z*6k( zC)I&>I2Y=xyaAPG(BP#jdlyHZ6r-(Jj)irrf*I%>^0AAqwSK_W@Xk)f5+*YWF^s-?g zWKe^EtQj`{Djqi{2mgnTuW@l^+r%e?iiOe^694E+B)%mSB`C06cUnV*+;;5^*Mb~& zdiyTK<5M5Q-fX4PVXkH?g^ZcNqCk^J@tUD{TDx!t5NjTtYQ*Ppv56SVg^Nvwi_Myg z4Op?R32fF}^mB2sD#67O!v*GZa958?c6^UGytG5pQ+!pt_N6zZ-SCd7=2h>ao)UuE zD1zDmWmV5#NkMH0?G{08)GYq*XJm0Bot4N?lSCk z#4g3PgMD!(Quxdzg(;zK(v+DUSNati2 z>5B4}R9d^1w8*7)73gKJy1B?(trm1=%cl0HyJOS4k=1r#E+jm3tM5&xxEKl@k%%P{ z(W$;65e(@qQo1ESe2jb*1FH4@zF)Eh(}bl(78ueu3k95w6$%U)($`Bwr#f3A7}EQP zH0c~6eJh}v^lp+aZ%_5DKONl~s#ZpLw&(AwnuL+Q#8+L6uW0!I%xwDcWn;nvXSqdT zX2U75;h<0kc&e}JLzfy|8B$XG`NE@8-<(FdFceBJL~Y9MA+1RdVrf9{CejA&L@)~C zc;UN(Oa5mH`*kCcN`)Rt7^fTH?4Z`y;_R`sKNml;bck7jr)=0dy@jGWP;Wy}8a-OX zIa{Ks<>0R~+NcIJg%vRMx@h*mZbiD2JteAkT=Q zbSlNbQ0Qh6!(4nC`-cgCy$?x?AsuA}VN4U29cz5ByD!=c; zCr?OflSnGZNNUa%loUgu-6E-6M^a0>C@Bd`5BTR_P_r|kf!~6^WY=&)FMkWYw4tWn zp~c~aiL4Jx)>BN@FHT|B426_rJ>AK=?I^RBuw;D;vW7rUVoe;v=);iIZ6RbWW!;Z6 zWbYEP426a>qH2;ucB7D$u#n9J+1M|=Y*XAxY)=vTqYVAigg!%t?a>bXNkU)3LVw54 z6KtQHU^{YUNR#v%lKUr95)2uZM>-_mg3sjMa}WecTV2s=jW*5&hw4}V(?c5texBw+ zT#XtWz3Z(tLmN3);nhaj7m}on+9uoD_~XuhT^lpOf^I`0a^1bd<~l86+K|ADQ5w4q zy^6=@Y|TnoQcl84pI&tgc2X>9<%ced2_57v7_p@E@Ld$RX%Tun7|?`vZkB2uX6j_z z<*XBiLUoL&8t&9dK4$T2bXcnSX%xY(lY|Mu@ieaq@u3uMQ`^kqfA+IPG2h4BLm!pH z?GWC|ku4fYmBW1>==Y7O`5ackz0*Fr%M|3cChpcK+20;}Ig4Vsm;i zH9Ry4g6ZaS`zP>_v2MoulkjjqX<%;>3@&rv2^)r#yO9I7h`6S%HROWxsdBshix}WRF03z>H}9#CL!ncL=I;~%b&DdNh-<@Sz+X&C)eG% z==~6Omz7BJyCh`E#f!{be&@>Ncea`>2!%w=GL4!Y9Zxl5C{!j9=@PMDy&(|{=>=-- zKUyDB^#%Z{RWH0K%?b*F)eW1s*;>2L5?w9!AkrTt!aK>`_cr+AVV%zFmA7JN9qLY%^un@)OpHhm~ZR8DH+7%4{=a zE5&eZtnKsJGE@B$tV765U^4p;$n0Cl%$C_oSH=mA>Q!cypQ~rPD6^egJu>?@ilHU+ zh4gGUwuac%Z4&(FDrhz`vt>5Tm9ZnU$|1eA&E8t%eoE@zEqzJKX_5cWY1caMP_wsc z`6rn<&A?G*4MFjfRrxGrW=rbiUNiPp9dy|gm;+`$HL%B5^{5M;knBSObuugiHvG5> zK%?bPSmAQ^1mU}Asl#8l4YaX-O_cS}A17pOa{C-h_c=vPHa-)$l5I?ALIZmgkEXTn z;#Kupyvi?ByiOKx@{j&Q#ajqpJ2WIjcd8ppaww_t;hL-X;|zu7N(2{{VI|eaxbY+Y zI76Z9C4wv0oE80xL@=bc9O+f*I5q;*$QC3$fzq}a33XO_Ia{gil8_;j6_Jg0xf^#doE3>zVBnn0~h}F48`Si|{|^ zqMBU1|FDM(cf+>1FwOtp;i9K3!pXAOO)f%SF7`wE95S${w7J+TH3GN5TM@p>hs9EO zCGM-N0yNYjTG=c*q}1$DR9A*V-HfQ>HUvE^Sn?iKQ^GPVX!-$=#uc#@aDMNA-ZoJ6@hXGZZdJi%KMTU@vVt0ns0NH{!rhZk$!g~iTVEMWn21u;G)eeyaAY4W|C zN#n5oqSsbD3v7%>C&%?(UdJOexZXBtJn-ih;#pz2+SremHT~}O@ln8GS~`yxnQzHw z!avVvjNg^d#J=;H2fARvk%TZ2SyAX;ban2fT=XrC+*TSc3P=e`79 z&kY^={Cbmy(Nn&{t0+~^IGrzL-!orKAA9pnmj9&Q%g_BG<0noAO{leBmyd1nQv6ZJ zXd57d@&54bOYrH2P3Q$Su@~4RH;jBzrs3N~s~6*e@Y@Qq z#4A3xu5^>;RUmR5yYS2M`0>Z`h>c?VMyq6)dpKOu3}YJvx1>lbWBj?j$FsGJ_m5gu z5W#K_+io$BUT6__f`63IB&y^~IrPNUakPoppWxkuMHe_$9e5L|a1qP8KxTE|jX3V+4ZJb`_LQ1@Tq%nvr9y9V-L*xg1d-wm zNzsB7TezBqG!^BoSz+HjV84y+C{U>+~xIy$Zjg4HvEO zYTakjMQ_iB9zo?x@aO9P?cTj0vf8ipjctzmd{AL=>Uxq3fHo%gPF=HyM$NM~qpLc& z&)nQs{q>%8wH>h9ASMmF)ovUKk4Nf4jRM+@yGhhm0qtf%(m_}~2iK?u0jaB;@3Pe0 zstZATW5$)CW=SoZJr+yqouLkbu%iQ`8B2XzNML&h1Cb4M&N^AT*i*>C?8oRZJ0aj; zcBzMYA-|mwJSQKIY&Yb0Xz~{d`5l`4P)#1SZpCg*kZ(8STMq`BnYFI#^vEr|Xgs|H zwfo7Rj$+ZRIVIvFXgEPbn^Ak%wzI!}9E1H30L9mNX*Q7>aZ3wwe>#EVZ!-5$dlv10IiT3hfurMk>rJ z0@_%MeK?}c$No%h#-<$Pp-Mnqj%*3%*fidp#!chk+%ckt*WYss5F#R3vc)WR0`!aM zk(&%d&f05E=!oRLp6U^l+}DS?1yoIjW(ugfHn2f6bh|LLK{NDLtu}?7v7bUoHECbf zL-@AKYo=H-OChUY8*GXmDsmw3Jg(+{&Q`SKs=o|1?Wy{?P5(mG+xdSv)gU0EKf0c6<8#zWR0dUo%0QJsrIM?J ztAv`X)UrwTW||}FZJY_OsSP8tR&S4)OHplTLf&S(%w4GY)yQ6QfNG*vF-U|2acL8@ zajacbdySOo^MG&ElEKGn9JO=?mfxYplN)~O>4B=tVESPfRDb;9{fn1iN>EXqrXv6b zSQOu=M_+J@=?iWN6#I2|Ahz<7xXRjvEK(Yfd<3c7J2AyULHT z%(4ibEv7jKzw<66W2@lF(p^lv@e>XguE1V$!PCAbJY2s{Hyr8An;~|GS&GQg*w-V4 zD;5_5OXJaC_**m$td&{|r1*N!ZSz1GE=)WZZ;NG>t!)t?w*5WFO;E}b##(q zc%(6OgrL9?-Tj>PM>eq|x`}OEtNZHR=!WE)H~1N5iNhi3P(-T^;O-A`ZB1I*`Z-~Qf%U!?!)nKI;W!r1n0Cx?Gn)bP%%Mp zN;8mFy>f(-G#={J)wpVKf*}Lfuv?W$n!TZFNzsYMnqww@A@#Ml zp4z8Q{sV18+w*i1J#XW1OfT)Ww8&qo?^G9^oCdgm3Fa^S1xtC@0%t8`gk4e+1D<KfS@p;tFJOAn+R6m_wIsY}){A%(G#xR`y4DQs{VJ1T{Q_PF_5v)*km9>2jH$sH0c~$6ca)Xk`6-{rM5`A zouMNH*+ZCpjZBOo3=>a9Vkr!2Dl0rxmt~gBQ+L1z_Ek;BH#SVkRhz=M3{*Sq?4ZRM z&2+2FkyB0n_S(RX`YvRq{st$Z1_8}UWyX~;UQ3Kl)HHItuSBEMecPG9HGTHw=&Z;1ajM3>=b!ZGJLH!x^IwkMOe5&D zGT+GaFeQa}vkO)vrfmS{?UKf*uuZo`!r_%gC5R)<)9|}Ujul9bHeWdQr03S5dKM>p ziOaIOa0Mo|L=NESlQD&`aFIKCAP1*lN_D#Pk&ZrsNsF^lES#McM8Kfr*u(aiuJ^<> zec7E#-ngOd&PX7sDKEP0&WL-pT0mRz)*kG?n3E2#IZ+1!Z=$(4P^ZJy5Mv5BntOvP zhTB=JCj`(0&2!+{&%T>Jb6rp2Q|SD0>wx%-li4V>?at zUBFiT02P$G5%}~4Ocxj_;%pA&L>uS_KX$elTC`_HzG@>aGFdCx7EB0jtoqd4qnq2m0ceZbc8hszjk(*=~ZgKfbXxS?s|=vl^x23yPLG zYc#YQ+S5)XW_#wEl>LGyyZ?mCuiGtI#z?@)kZCSvnjZd6Nx`aBg~jwAypD;cLs{Bq znMhOo5-F38A4!g! zZ>K7g-1mmY5ripG(cd3G$K2unqA+SG$e}5wM5fr*39I_rqiS+NwE2U@)K<;q2{j^h zswXu^9pVHz7Ld0wzbtuS?(CpG8Ny{UO;gEuwrvanO9ds1`G-J6;>J9ty` zRt`xGO90a^-qwlh0Iy$$+ZDOx(6L*PJ|xAU><_4i zMw*nG#;04d(w@l(=fhtNwy#ScR2_IFTK(S#Sl_WZS5Z}tutivdFs0)S99foyyNbPEffZ!qR z)T~bz)^}>we=V#h(}jexDDzizsW?xy;;+&IY&C%*>OQCy{fpz7a%Pz3f&)umWd#zfBO`Q>Q&%P8}$nB>IaS+txC-+HS%QJk?d_C^-# zX?dcO1#S=7P~X8UCP@}%2J;+bq08y`u0IqDwZ5Kf&gvX=Li=K$JVD>p^#&!^L~P%6 zd2Bfx#zIWrjCZ-P+K$RN6MaXL{S`ay_GvHc!>48Xna-Jc>G|jlN_r@;b?GFX59fR4 z%Mou(Duqi5idJyvf{vrDv*(sbFW>MBgm11yzXHC6Uhi?^B<|n!ZONDMYtiLKii(R1 zmf3uPJ@I=@Uj=rOq$J+I?r+GO)8EJo3B0NOcQtmG!+IWqeWi&to+F4eiyn95nslDI zRRq~*Zhx|mind)F|L@+J7)}nte2Q7)QDzaQg%jbAZ|O;X6C?aWev=_@4%5yO^5!t@ z1Wle57JDq+A>V4qH=CW*cH59Oo^CL!PHhkm%dGJXSr5XD*wf41p z9nKmLIz(9g!@aEW5J#`^z}7Z$RPY=dK1Rn_<7x6$ejfza1)dYDeOT6bj;OiM(AqWG zYdlSAal=2K=(ou~k4Y~v`D6%`6Kg!rVNebpQaIjiOy?Cl9YbhHnq1RxX0_yY*bzqC zD?7JRvgMeQ*WQN&KSt15*=dxOohGgyxq7vYQU|a(O=4i3nY6)2bDnU1XsT7e|^ zID$rjP(cTxtL9*~42q$@_+**a;pjS$K8W#NXcM5s-PVnP6k^T1T+_Cjv5z3MT0{^M z5p=2haIJtj3a!;(i9|H16%xUa`zZ8=Cn=UHnT}p9%k;TlcvLmEv97`uw#W))CD>e&KRI zeq?Ot>1*}a?(Of}9c{Gy_g2`R54_+rXpET;1cv%Ew85DV%wEact}s{fnC5*< z&bJMeMHU9%G;{UeT89I|gTWGr{fWe;Rb+P;kQiuezKtIV8b9~au;=?Hlg5kv62-!3 z@-W72sSyl6x>aSXye@l@T_7j+G>4mOKv)fV0A%hHGTrJck|=VT!~a;Ke7F%POMoKP zXKZ*bJ>QOD;1P`F@lH5WHmTMoYC2ajxu)W) z93eP0`FL)conz$BjBddst&UDN(JhQ_Ro6;%^F8IwI{IBGIIGiFS&6Su`X<(kjIBoE z&II~7;{*ghr%|0Opz2VLfGSDvIPMFGM=A{{igB%K6HruxjDOOsUM19Q#b9!{N3w$O zkKeMUjjz-Sca66ZdnOuMI6RL`1!*t5Rp7Y7yVVPC6gYMuzT_HLzT}K1?}C@LF7VQM zf!~Lny&72m0DIoO8emej{svIvPEZqb!Jn=C2-k&(bg3}itsZTO$E)e7{{FncVS7Bj zgBSyWVeF;vhZwDUWABpmp7xktHb&UTt|bk(+g}9NZsN9eA1kw4jlnE`>=rZ_nUKR$}>_OKs&)NxNXi0QL8+Uk0dff{PNsM6En<#dU&* zaT`MXaXK%dxr~qtJhhpqdz|${Pf+_c+uzp*)>FKt3VzVNO*8Px+tM|0Vu|NrJ%<)M?CyMvs z8Y%GLgb3agNVwP|@kD|K9X(Li5h%dPAeuB<%1sX8rm*7DWlirh;f9u^{Vcd76917u4xVH-k89qsLWaPS-8-0gyS;W7LI^vs!)|mM;y-@otiExEzv0NHWl><#xIgI_%5DR}Rv;mozb-S6s=LF++0X3lh)TIJy zFd$i98!n)|22@Ah`U|MefOZRWsuS03W3`71fSgxQ!+%L`%mUzvER}whH1lt^E0E=@ zdJ34KU6TJ!TH8m3$j;DV0bwboOKlcV;)2HgkFaWYc@)H`1}hl~gh`Z6bq(CSUU2H0 zK)Hs9c7=b*El#fV*g7-<8P^22_d-O{8{xhHpC%=Or(ZkO8(61^&5}txl}b>DdV!#E z0LeC@j%gWG71W|YI+4gg*1rIVy!_@<-$5F+j{j8QA7_5%28sl;+VmsTV)QioV%gic zcHvq>=N#BvT+eIU8`t{xl9iF$oHKmv9&PK5Pq8Cz8%rCex9LhpgB5sLau7WCnu8B` z^Kdg~As;_lIl{w!JrqHk|t%`0x@FbvaQ@A--MZBM>{6%Weeo|` z>ICwCu+%LmmK1RQL!z<0l=?v^sH@b~2s)*{^rl3qPq0g!TG54zr5aEJU!blN z$p67oqjf6v6~$6FdrMt{()3!_TmRcr>hB@wl=_Mr6Q$0uOP!MEE%WdD)^8j2KUiW+ zD=GEW_gLa4Z;7KQNv|b-^rxN@Z$Z#0@$4HgNGxx+d{wK_SBRdcY9|KXbXb*RH38HSP2swAo!H z(}ueyw2OpxV<^{6d%c_Xw`|&J&{GfX;eGH8M+>x5)j*+r*vt1gH|=vA+Ic-F_r~=h zL;2V5QX+@ET>o*qs|KFEE*}3lKuf#Gv9vF{EN!~2hyV9k+WpkUKeV!h`@Oo@2`8pk zT^vF0CShrZAn54g6W1nMUz%O&gz@|WHYb7nA8dgQEcNT}u+$CSQXl_GAEh3H2v@1k zM$jqsv%y5EQ|(eGjOQ09bprW6SZWL#lzR7VmU^$Z)R}#idNN&~L|u;7=Zpx?G zl*Pu*bMY)Y!(H}!g5eoMzz(&ug@WAaW%;Eay9D&)0>g4zUL={Un_-*m4w4ND*&SYf zSG&nB1KDV{__W~+75u>EwEuqyfTiIs`$l-W{%kOdKo2wxOix(G`mdchhp~Z^Lo}g*SHxkMmOgrDUXkVM( zp9pR@hcx+xtVeG@<$v;B`}8qGj=1&!5pfY!wx{~9N?jMsD&nn zkxa)CD#)rgMDhsKZDgXh`4}hjc`lOKO-O-@%oLItV8~qJCi9>}rh$pJgUo@9b1^JQ zi9IVhb=0*m;uIIP%Si3X%`El_IK>5~WI-5A%@Jx`*y&)RYaMD<+c(Kr<}U#~1SGqB zLaMYkQpbNpg(azBOmw1))TMgo$T-43`U=DuY$r#%zecTY*SpqUCmg`*9%4mwA#=3_ zpUx<91^DB`NK^`SEn@J1nz|Uj`(mU1E1{6oM~>IypUrf}?(xs=k#FvSzjkF&p&#>; zxWNTyR`^2C^3r9{u|&Fp&&M^o$y$wncGavL{^CE*Q7kCr;XIs*!MPn<-)+44ec*wd zq`w%yX0OA9(f-Aug7>kRu_T7=gxE(o7Wbv_v7m^|K}QNPN6hhS(wqaE#B-<_Hi?P9 zN;C<`vRiH11g$Nk=M?O!%R{XCJG2WEcG&5IVJXkzLF($EA5clseD~J?z$Sm_K^d>_ zq1ag`!;lJy(J9zP-JjYkRpt9lI>y5%`0o2Di!-w7IBI(Hqj}aD_#216tMGR-{z~vy zjlTmK7gJ+7rd&i`K1D8V#V+V-LR$&F)&<=}=!=BrFlhsWPa$|9V;DT{l(vgqxQ&eb z32}$GpzVaN2h?_?@m?r(4GXC0Sh3<-7>Bj<@@W{wjrUasonjKpR~bN9be5PSff<{q zF``paBVRMTga-W@`kD_t@ACa7Cq=96Yp>JLw}(bc96NTzrRumRBn~q;oq8+VOHgfx zpC{)c7v1GU^fM#lO)i*8aXmp_NKZ@ zr&?!?j)t?29|{l0-`KX9E}`XtU3J~}DRvh$O6Uwi-D2NO=p}@@#eRg)Qvr44*8XMb z(bOpDB^B;F&uJ#rX#mt50*lnPpFQZSp zf;L|lYN;Q|$lrnhCfv0FI|G=^_4^y87Sue=n6H)-n~oWq3I*h380~`k4p3R)G+63h z1op*lz8^flp(i+LSJ>|2$F+^%`8%v#v6BrKEytmHE{d%vU0zg5L#A1&BZIj z2AAiOmc(vbS+Ybg`h{g))IWF5_;Kv&CH*P*y|%DKTigO%PEb@>jCCi8qmO|@j&^kE z%BAu&lEjTcoGy>fngw23SQ0J;KD-7TPg?B19`|9Dmd@ijpb1x){6^t-Aex}TFo@}lf!K`1hD$TOBj%U2Z_tO#S-N#eP-xd68j>W9V>0;7DSo<7rfy8qFA z4$D0YS15%2i;GGYNBDx7^bSnpviak`pv|w?-$XyCX>ERsy!53K-q4F^UNrq9AGb|E zJA^~fDzukc`0Jm2_o#i$7#cX=m~>3Z;~i=$vR3RVNUq)x9d1ECt-exz6#FLL!zs9R z!S~cwbhS0XCX%}oI2D1;G*0OUI?CY5qRHYcFmiFU{Spv!PS|Zl3=>A=w_7d8@4na_ zHBk81Md2wESW;^w{?NZoeC`_k-@Q|MjwIiRABvls}--iLzO@%Wyb0j@s{6ex}l_I?%@ z@i;5+XYKhcz7(dmp1Mwy?N1m07b6MyF9K=?GCMKggxw9;#OIuK_MLSg%L3N36%ye9 zAS~Lozp;zvDnP|^@%kY^RAIr=XAIlUh*jOk9`AG(TD`Rn((7kJ(QE;RFAtTWG^jjX z`1~Wf*V#Z|phH`mRU(0odMgSlw_F7yH_4=G)u~RCRIQ;cl1k}RQzezs2Ja%Iva{@e zAY&wZ^tRLVht+nHVakLZl^84ZTJ>tc{okPqgw~=EZMS@lx3la+fvE=+E6j;BMJ~6L z$SapHS%9;hUS>_UF2_h>oHg2-hrcQKvwbeE^{iTnCO7LV`S=uivWBb)Nm%yn&il$d ztUi;ttvKtUIBLl`So*Eap$^`T4G_UlaF1O*_BF6W>bGo(V>c8c)VTrlv0p*GZk@u) zuO#e;-#Z%jRbE1%)<_brIdv74@tU)-n&E~rnVNQ%2dZ8JR-N<`&tf(J&Tjn%5^hBQ zK+Wmkl-sG(k+QCi@R4YZRSmw%gDCHT4Bp$D63W59T8&9(E0NVO)F7W89>~c0LrnVN z2FKIrR*Q16mqfck-RdO-YVm+{7t!9=Q!(n!q?~^aid7Bv?yu?fK=m10B-YXnMO(B_p@Am=FP~S-v0DjYRgope_IFE=%pUnFU`u$ z$M%5R3wS@EJg5m6b%;&P9&572%^EXn%(!v*|G4pEX65J34$K>K%dB~`7L@@~X4257 zzGcR&FXKmOaR0(ALzY`MN()QwWCzSVv8@4j1l?J<7zbhJ;;9RA7{F1R*(#-e$PrpZTcz2;$v$i$@+rd57=~z7$?>vyPp+C$|Xwnm?tDo*-7lVz>T~>H(C>J1@*7@qMj}olM z-6w^Juf7G){CE&u4&tvwU<<+30qjnUo3?*PVabZZ;)xT+E-5ZX5v)0-*R8zk@=5bc zR&t)e%muWv4^(*P5;r5R4f3W(w$h`&vs>wbjPq!W>IXbYUZBU<9D~J_K4a^S0kX>? z*u8c`H|QUXcH!RvM`shUCR&VUT0bAj)Wb-#D@C%Zy>x<)9_ofs7e!PusYG z{XoVDcAnZuz`Ski#Ni9oaEBlaL6nMiaZce(vc7dR%|s`8cpk*V*cS{b4H9Fv1W~H; zbjT+GBf45O%mq^?oq=`z$3Ate8(&eZ$;sO@8FGK<=qKB5MG||X4i^i(_tSJlI-=PZk?nAQaC|+Iv}GO4;4dei0J0EyFrzGZgVhhN*ujh_zB1&i5??$Y zdoZIKUxVapJ-&F0+`)_u_)3+pjrih0p@SKl@a2=Q&G^#vHeZiRxg{%e*8e!Pjn9Yz z&r%1f#gSJ(!0*1;rh8GlW`c}%2*Y)2mb}62Uo>m}7&I|jj|H?I*!vV*I1|me^c$sN z1-E)`VBU=g+P?7ku`pnyLBC^;=hbEBidi;!!O6kzzn>30``aSRY+4lSR~Gs&pX8re z6h;o@!N4X?aKR`OKmHicZ`xbVO|Zvt_Co|aOcOn`!EU0WGj!AHxyw(L?|}Ej1=Om? z5JY{>N7dHmV+9lHCTJY|sQ>=iXXubH0Bf%qxa4Cr#oBM;#BH#>ZY0nR=w%Gxwlb`C z!K=-yYABn8S@ce*6)4aftvOY&^Sjm!$x@A|F*vk!lbB!|91*jB>ot3V;0!F_ZI##z z48n2B7ri5%d>ow(g%)th`>w9)JQR=@f{9k_`Zl$qSry|cHL`rFu>7&iS%ss}kymN- zoIPf=WnB=IZlGAX*WTQ4<4D1gq&MhDM1A#_v@n7sK)M)e$540M`vF6VJmiU9m`mKr zj;l?Ap`Sl(SBLI;8xU3trlVxJ5C`0e`}ZJ6X_MWoTx27Y@Yur4hXdeq*SerM+0AKg zbOoVS5Ryqg*xu)~_h~&t5a&G9UI8VhI$BW&=so0MDE1rxQJoHuHjsV>vk(*(Ipy-$ zG(J(=H4!&rVh$M7jK-#`9r@T&6zGPz@Ks%dTAJ9P&cDo6IggR6fYOz7N|kQ1?^UwN zzPl#TWJQ;$Zu9Lcz4frx)&FXJ9|Rn>NmtM82gqp)+2))6DDF?@2F8o*cmv}-%>qN4 zso3AHJF|*x8a8Xq3Gspa(7}|*bEXu zZ^BgAJK;M2uXE0I&RN^4#nQA<61LiEtF_Jk)Jm9yRJ@ar^kx!5Z$e1IC?p|Fk}xET zWa!N#`rV(e>zuQ*mG}Ge{d_;S@Avb){XW-jkG-zf|JU{U^L#!3yv}ts)QnMQnN`So zD0QXw~6AwAa$pRYo$R3X(#Ot{!qG+&v<%usvEG1rgb z_PT(Onl4v$J=jHV!rq#Jk@e3>MK)1uslUm7WKoJIAn~uO45BEh3&?R(`4)Dd4>xfP zN%aRZBv$Y-R6mxoLQ-I(n)Yo~IbW z!h?F@O({2{})Nr0%A*5_CW9j|yUINiPcbUDwJ&Xl?!! zcm3`iSF#Yo2fC$=GEXN=piLwzjayq1wqpj!w(^jhdTj zQghcSicM5%I-*k~x~q!bDbZh-Dt3{RX0ou+wV_yzwskzEM>pGxRYM)pP<0Ye&evYI zA<{o#A}ZvqHKt9X<_K4M>riPEgyuCmY#+cAR?Oz85NzsYV!`!Y?-r>Quz=4jtNPYaE_XC#xr>yCqnkkOY6~m??t~NX;~Ynl`)bm`Cx7j zesYwI=?&8<8#I!I0Cr-9kP3tVeT9?-exEkCHmV!sYTJcj_Hl;Sd#eDhJ zC*ErDz9?QyYOQORiuZBx_7U$Y@z#qM&b)Q)X7S#NS7|$BN*Zh?QO{F&Uh8t2towO` z6L_I$Vsu6%k(2$tc|My8B{k2+UB7!)EhRUrH_)=EWNitp3fp{?{}}u!RpsL+qsfFx z%q}XMp~6LW^`$5&)Dq>UqTEpW%se!)=z)os^8PHHd<3Mr1m$ZuT{l%;`@F|>sH3uI zLQPfpyuB5dBN`RaibkbuYtK6Tc>n%Jbi9)`(H&y(lkskN*&6Tu5=bwr@&1xkqoQNS zdl)4!-WTDt8}DZcC<9l4`QUEw2$0g!D7E<$X00{e#o~QiylT7`i1#J&s_|Yf-c{mN zO9yES&Xwwiv>H zIYmm>4uaatQu5-i-|eZ1bnSXI2P3p-{reqgQJ6-3{TAi3=|*T&IK9PBLP;mf1z#4UG~>UgT3yL$pfg!W~v>>6kF3R8^S4wGE^3QU1N1o$Molf%P%P}g$hS&7+1*~ysK#BpXC$UOS||90j~t|r9@0t zlu@{Q0wWNiy(w0@a_m?tp&CMYjZn-Wl0-dgUn?!YQmdiJb}0{$Mch`}Nd@v;-W0RUGpH#lnN6Q2YdrS~)_4qm z7hbd0Sr@H&$5+Vyl|E;C{)t6=e3@QQyPFZ zG*@f>3=Mf~dw0nA?ND|>hHz(??fU86$PnIFOcO<~i*D;eCf5nuH6 zNUif`Z&`;WJ)*!ZJ|w|)>(slE;%bH$C%nh#S#0Fz&&l@QRNO~`py;Zp@i36^m@&UB z*t0g31kDa%iP(JitaXaFKVC#LIjMEb_55rbPs_pK&Bt6nirf3@(ZKNoxEZSLN<|p1 z7#>%ChBq?{4Nifoe@AgzZ2hw-w=K<~%~;8Vi)qH+@v6N*CVA$W(hO9Pd^#n{;O(bZ z#fYya@}_Fpn)Wo`gS&qB(lW}5(fx_eEHnDV*jn0~Jp9dz2FQDEA{x|o+M4Pa#Vbh?-g7-`EJmzB1&LlJ zA|{Ixr#V?gx9Moo=#)qr)IX9YtgqQD)s_geqZHar;vIum?dBp{#L*C0)6%ITv^R?h6nYBVDQbMD{=VJ#FMuYqH0+`(aN?`mkIWD!zLs z$)3=mwK5L9b2L2D|Z=Mr= zKCJU>6O6Ck+J2N4;cwoX3KyU(h#SQF8Q!SM?Nnw}n-T>RHr?KQ(=+Y5KdgP*!Yqjy z6ba>rd14Mo_>f{7nUNi$`H`MP_mSwQ4~_0@MH>=*$Dz?2k&@h55lER#r?#`BHB4 z0F`k^aka|GuRNj|S>;SxQ80Xa}>{3MI${& zi(V%MB&wpf@UHuqqIoem{iBNBEJceP+I({RqUEg#T6Iv0UaX4V7*n)FHb1>u+O|;& zP-OBG9@1JvtI5#Z8*i8l?Q4GFbhU<*YI8SQ&glBNp7|p`Kvho{s<772ak%SuA3LeT z`sq(IGs+7~V6H5dK(R{lGT!#fh-7NL8Mv8&$ZE4bDp!<}8xvx^t2l=c^?k`PfhgM; zDMPKD92G6(OqDA(TlricpNNyQN$NY65-ICWbc@90ip@m)iOR3OYRA_o+m|EjEhUpS z6j`=c%P%U`m~Vwj{BC=+ZdKkzyh%Weoz`#4qj4&K!8l%KUTx9ceTv?Sn!}O}T4h}9 zr$s~s<$V;d$QI%D%I{A_aF0sKDPbDkv8=3Zl(nmWq%7sVoU&f)ata%DTtr7GXO1F* zVTUp=X!oP?8;2jry=gd~Flh{L{hM|~2+zSTV%D=hpD?dZ%mni+ne3fk|3F39utuE> zu(NaV4k;?<<04&77d@qQzMzSMnl~^TuWzX77Y^GaVXIV_SpI3`ngbHliw9EgNR0ec z(ki0=C&XP#@-RPf%8qvd_upX&qZAV6m}&_<-D1 zNmg}PlI6jE9KCSzKx$Ll(Y$Q5RM9+dcx$-ev65;*hl0Dt6r6BK!KIRAxD@;`l$c7d zYv^+3;C-+j$&`ED%U#YKzEAa-9O~{y_HQRyEvl1@Nn|Wu#9jEE>RT|5%a0`LRnTgR zYkolmt&V=6Eul@7dL222H5kN+Z}yR&Id_&L{(lIPs1UL@O%k2(k= z^6e4a2-|?Z)uP82HrECcit(3-p2G1QGp|nFsXlT-(kI+j( zdqkYy(cDM1j!}pVuNsB!9Wuv`!Ync$+PN#+ihScD^}swxhhNUp1$-;HLH&|eez;1C z|GFQ|rWJ2c!?u!Ao4ayeL4KvNO$DuxS3&*sm;|km?^LKQ;6#>?`c4Hy+1&k9$d@`_ zJ>;5!;a*njU^#q73^V$m>9p!-bkeNYi9_&X+&U;{+XHfCH z;q~(4_?ajm_^U zcSrNJyVoZr-50!BB4T$EJ}} z1s%gg=OAISN+yN#NF6C9);`g`9hrGVsq}~A-DQEvh9Tws1vk<*`Q}zOAKBs*O*KbG z*^$C@KO#q3Z}(_k@%sTKw#CY=&9{BjUX}~zX`a|2JZ2A3%;Wq|8T(}%6tj3qptbHu_v6ph;&IV{%v z!bI-WR`HbF84~ue+$l5oy>h2Z*zIzs4uZ^+yHp9gR_>J9-7 z4Dua-)3tn%ygprP zekEON0;|9ZPzx$R8kkLd9$5V&_aJRWhL#B8pGwynX-5`r53rduOF{ew!f^{frcEGa zZ@RYayL8Q9m)&fHi{ec?Ph7{ByvHhcmQV(4RIml71%c zKu||q4yaGe&{Dz96En1WFz2;QEd|tll&R%_>Sr>v15amY`Ol0eTdeIe*yQ2phwOSZO4cqTHY5!wfp+M!wxF!Q6K zS~jS?eu$O@)~z87WbYlS^#R$;nR=F$TzTB9b;>WvxNR=vJV)fLLC)E~b1p3TNUY!C z6J@>f$lfgBku)2)Z@v@CiQf5tuK)k`K&L+$fBSLs8aiQ5)g(TQxY)FP)3gQspjBrO z|K{e6Z+!U9#<$-7c-!`mHtqQ2)6bed|5Dre73tZ7$}1^nWKEg+X-1LwQ{>`1RGe*9 z7xB8y?r^%?9>Y5*JtK24=L6(G$$##$Q{E|BAMF(FR_7J$W|9;^VXz#7m1Hi9i+8)yQ}parx7jlCoR zB!Xm+0#bnv3?R=TmpqGH@s^{B94uF%`C&KdYRg|5b~l9G zKG#^`Tf**~I?LZ2c9&jj`P0JgzW+rxXO@+}^-9a_ah>Hhgx!}xrI0IfX;c&UaG$J*LeU*3vS8lS!k2_ZU1eB`yI&G$kuhSN&_&Ti~x1pgy zTZJnGV1vYS(`h#h>Tq&b* zPsCq}+Xr_(E;^)xt8kCP-GGbU<={5l6L4E_(dizHKR#X7)xi{8c;JI3F6U?uj>SD5 zw*ogFcQ!6E%fUssC*iKZMW#8}fXnlq(ugY^vJ;y#coxcMk4+-1~4>;4Z^$z8*{~Xp4Si;pOBcCoU%afC8{p`Pv)cezYo&pfCXSN zkSqD4bge(ofeEs~SWpUPf;nI@SPAOMvjVIFYrsaZ1#AONpc%A)1`xUGI^57D;mf+I zv)V}G!v3%;{U%p*l)^V{!)67jzElar{%`_WvvSFrl}pyFT(V~6k~J$XeXU$sv*M?p zlq+ji{A$hO%9<6wtXXko&5FyFBL8HKiYseWTv?;y%GwlH)~2|!HpP{-DXy$dapS|T ztVQw5S`?Q{`DHDNN7kaavKGaawJ5HvMRDayp#Kv=Do6$?KnGbM4HzH?v?9~QBe&#( zQm_%owe%pe7l_>N;ePY498Hn{^$(W@??bjpIyOTyK{gl-Nc@OsgEm zTRnofa-?%RS->37n3%P`)Hxu7Jita zbw1*#Bac3&^8$%lydy*7X!F69xY$AtuERx9c5pN9e%u|n*sc$@;PO+JgYlnaXejCq zCgc8$I}rDuxM{fiaPx3^$;ZJ$+#hjkaeu&_kK2MAW;h2e{hua2FRRKUbk2go)7> zP#tsphl4*JwCJvu(5>^4-Qv1QxsiGzbw|cT{EH7}QUrP8v;{JMC{6XP)c0R;Nt-*z z6qLq&O2jXbTxlQ$$Q2G!&mNoakO`EplFQ?BS#w{WQ=T{Cm(t?Hy(ZyH8?AAO@SG}X z%s=Re$}jao+muK0Nq8H4VrmVOHJZt5bgHk9u~=E4ooBSJFl9xsB$L z@Efktv|qtIFc-`L`@wJE0Qemo1b=`|ARf#Hv%vM>Iv{1lfzCh^aQ!>JbL0NOO74{T z`Dd3kzcelXj3HVzm<<+zj+d-MEiS%Gr_OvtBLPkzRmXfNJVu;0#!4Kw`Nkny+MFR; zCddNW;Q#cM#^BTity<@ZVw5W~hB96oAZKOi(y{lCzb*Ii@_R2&*l4uIZ*cBA@=gD5 zN4)O&Wlq+b+S!?_tLL5f{FOHjeRf)EbMm(SJChpE{Px6;&-nWI4_6c~9=*J9QQo7I z@4n=riFc0b^osq*qu&nx5%;p~hojyK{5~uF$;w;KfAQ*T2R(7c&BI@~s_z#)-#dHn z$)BG3`LXYw_1#IIEE~6QTzR9=0>uc_xyS?H4wacrnf6hI3 z?Tj0SJTvvCVb4v!e(=*Z1HL(7`{}!SZ~g1;zkGDsSG_)XWYUr`4^Ft_qK8ZFy7+;j z+vVLZ(Y2_hy*m2d-1PIbv|;x9`>r_l)zPP3d7x@s@vEa>8hoUFb@IKr2dV~5$s2cX z?o)#Xoz?UB^z+6Q=Z(91bozOx`q!qePwJR|nEj=}PYpWNKg>Ss49|&8N8R7|NPW;* zYg6y<>pAhIp0{*caqQK}J&#|XwBp#Nqi*T;nM^;fmeBVFSx@BHehzIaAAaj&U+)V& za%}1M4huaRq^sXkvS}O5ur^&e}rQf zyE{CVn%iQ#fNv9COp}V?okT_xUQA>t?NpEobnsWu7a)Tv`UpQKJeHzoV(%9EiCm`j z0|S5!u=q7Eu!A!}e}HTyyqd^0_xY4O{?Kxyt>k$dvx-&02TXFn9Ok}6H&Ye5Ocka?9p4Ak06&bboW4rV` z)i$W>aTgRE(f5iZ`?a^;m(VZ$iI;nge7B{)V_fB|ZrytypZu2-PCNaK)V~g}6th0j z%MQ&Nc5ZIog%^z)eesy_g+&u47MDz_s;-$jt#t(=^ce*!V7|+Pd}}biok?R~*;Zer-Zh z`mOgp@p89*j*%_B##O%Cy?1}-=coN3tyYaz%H)6B=2`!#Mn~J+*5v=k>9d+Q7tJj! z8+c;ktY_3DO6t_XFKH4JhFLR=|F?!GTQuM>H(eqhFo})p7W*ZRNW@Xmz?AW&CE?I` z^#YVglCYbgPT034Qo&uPs$=o(lXg*O>)VHE-K+!m?elk0r_(#8w2rK|PuZ0hR;4)f z_DNNsyF*~N@HgYzC5{BPOFU26SyF4!_fNyFi=KDs`RIMPpEK3c^@~1V^z)*#F%pL< zyFi85YC#J&N6`}uBwWXCn05eN4|&tL7u`-`3vaq3Zx-VcBg|AqWSM>iIut~1@ zDN7rTU#FhNlZI)lC}RzNjr6s+4U|_87LzxJIMGS898Vl>1t)iL}UTh3vcMv;6AIhww%vR!tb6-IoowAE@H`0zA(yicr3-@9}*-1U?Xm1PmD?mMY z=YaY2(QLwX?(?NhKy)Sv_{A1dfqx74eR?uyam5~zN?0ODB3}>c)U#oo^*-0%{*HxWv?P`wX~7;jV9k3!o;#QJAlXlM`d@T2K2+JmYGI{sVpWAqb6~t}9zYqUF;!;SHkAD^J zD%>9QNiAh&{+6ZeQ=>`W3^r5VV(Qrjn#j9`Gz$oCA&*I&d6YF47|g%fq-`dh*qfSg zSL5GCI^zV|M%y>w-$Gm}VTIJ&pZrafw-^)>w~pseq8+30XOX@bv{FtraZNl!AL7Jj zmB?JvC?}t|6w)lf9Zi{A$XAbFipX1~wAjApHlnF~-?aKjFpXOX0qi z=i5k}PQD%FZzbHxv-PKpe8QI#pMsl4o&~gjGvn4m+Gf(_OBm(n$#Z~4;IqX ziTav|FC{LOGEzvtkNY~>o=pBd+^^w&4rx~5U&VbfY4jg3_)~8m+Od-~hSU!dh}%e- zMAA1)-_UnGNRvohB5~WuBX3zrAwHS**W>2X=2XhgrvF;V+eF(M$d^o>3c|NYdDORt z@GW2?`4&;9lfKEMyd2UPl)a8;`=9Io%^sLJx}R2jLBDp5Uvf!5tIY|obTArB0yDruupB%IHh?YQQ}7Mw z%Gf1?RNw?@U?dm^D!|oXK9K7{+%@1e&=?Nei`$9u>IvjJ8#f5@!v3kav%x}89}as3 zcPrQx_IJ9ppLR4j0q7tNvQ9fglKSz!)$ARDc;^HdqWE0S(|i@C}GBr0t+D zaDz-x2xfvMU=?Tpn?V!U3%V9DHlROnf;4bG$On_a3~&or0v-defcL;RKw~}k2C2XV zBS9&c1r~w_!CD~K7ThnuKJiavPJxqw9b|#Apc>o&?g1;oI`B5w0a`$(V)_T90v{Lx zMuTEd3ub{^z!LBnSOeY$+rcjIGl(yt&ERz423g=DPzWl(EU*-;0h_>funV+;gh|XP za5`{;bdU!ofNC%o+yRz@C&7zg6W9Uvg8d+2GW`uwfgNOmJTL)NgIVAnunIJQt)LnF z47!%G4#5Br1leE=CM3s?eHg0)~H_!P+1l|4kRKDc(-V?aKb z3g&}lU^UnXwt`(iu0L>lv)7ysbdUu`gGpc}SOAuTXTWPft}k$Z1o7-ga`naafsvpP zOa%+TO0XGx0b0S))vRA&fNYQtD#2W^46Fs4z)sK#da#elrQ>FX?+bA&K^<5K9s#d_ z?O+c$0D4U2nZU{5bZ|B>zz{GJi~)t963Er@J&Kt{{GPoiqq3x$AAgnR@~sB-%4mM8 z#47;~4d%D()kT$u36H#kZpL9UT~xwbS_?{tR2GT0G3*;u%BupTMcL(49F9}>(U_q{ z)#3NuNjiKPHN54ztU9l_vZ$bNn5Zau&lc^Wq{&5vnMLC()f>4wgbyo=2@ltPK}}Jm zs6e$*C51&9{PrNPe0WW1bxHbk^~J#4XkD4ShG2YkdF6D(7__aCG7R;WWfRIJ5h3zc%RzXML*(()>Kiovxds?q9IoZ2X6Q<0=2=EAaK z)#$>(wd1W9WD~)V5yiVqRcY3*_aY&K%L+$K2xrztR+nB_HjRo%J(4kxh8OTXg=mRV z7VXciF0?u*?3cv3B{RakEWW(y72?Za`dAH=2T{)u&RD~1T-)9;N}1;sO&?cYP+1tx zDI=O&U0G5#QF0EK*Hla_N-tM~E3@eQqT1>~T0!B|f{K#1az++SRP*hkg3=mVt$L5J z5fw#cly3##R}CRRD=+0&G1YDPbEj9yU|1DXFaD85YL!?){I1Xn?GV;+t>=|i(dDWY zq{qhtMtp~?ybd$&fA^U>wk5nyRA0o-mr;Dpc}RI>E?rz&G-BK&79VZxxN1AnklfOu zBC%S?aFa_gfMG*Fdr%p6BX3ePF z($2QLVZt2FD{FpGb@>!&pjEcDe@Iwco(KWAQb5QeS!9)lDY`Z5+x#kbQT2r^z|10E zj8a;ioiQvk9GX`$eljo1w?>FO9Y&N8mINOG7pf;M6IvjPR90;ph=Rx7)L*V3pyEvn8G(o|kKr2s-=J_8KfI-;GPdT7oVLCil#wGfNkd}iW6aJ9rG<)5lt+_PF}s3lXqXPF_R0*2 zlp+Cx%W9@%@RfLKMsvcjQ zUK*h+qv)LSX(K8p4i?j^&?Z8L7gZNXmDc-oRp><}MbqR(^|2}Q*jh4pPeo*(Y%4rW zswi#bh#b3BZca&UQE9l2;RO}#s9Eu0YRnv#t_sg9;H^U8eCd@nRmG7ePre8@RZ`uC@rZNIZ^FXFqWAaQU~({&dTzPBn?wcRWA1zl~k2j zO@YQrueMd7<&+joA6yoF3`$~Qg?o8;`P8Dka;txb7gSBQf`zBa6Vjk%=Tw(xs`;+w zcU7cmxWqEX9mdEC>DXh0%6Jf5Su(yVJUb+0a4nyYs#YA0!yXQ|Xj8cT%zZv_Qf1YZ zTMeyk>nTc&j+@+DUD_^(l{hj}V>;oG#PTdL@mX+B7T482JhP~3Ja17DuKzHlM&=}W zGK;42-uaAzig4SRG3o`-QqLi?N5V29Q%6!ns8#sQxz_kdIMV|DNk#@=yBR0`lIkf1 z6_I)hONQ{F89CShzp46vM2#Ynkf+ib*m#*@);JC>7m9D4oDd)nX=Vm{#%bnMh{oW-BzN6{_#8 zP}Q+Kc3aJavI`=ovG68E6M3CoSz)w`ROtAc$a6%yf^ao}k;aR^ zph7;_5`N-AXd9-s4SX(KLM$&~H9cC5hQFw&EU%n}ZZ(!2WD4{?@*tKkGP)z#cM7T^ zyNkMysU3Ms%`mI<*jghoLQa(I7sHLU#YN`j$fCl^f|%Ko!#WRlvAid|`T{=f)HXRK zB(|=cqN2&M{t*)YP_-bhRTQe`!xZNKKr9E!~u zTqeAPB#MM^%f0l@;3*Z=qJ9}xC3Tl5JTfhOG;H4Wm91Tgib_y zH@bg^1BR6$J47e1w7D(B@=Xv*5l+qSVl~rZD`VMc*@?n&k<}Uv>6p9SYK^9fO!&5v z6p0Zfeh0w_{{&tikoJNI-a2Ml`mG8n2L##+q7L`!c zHe7CG8q0^=B6UT=tf`&N;hWTg&Lh-efc&4kFLZ0nuFP(0EMDGyUT?lVg# z$|Hqa2TL`%y2ChUW~lv2(hBQ~Yb~_4F^N)5iHndPgu#MvsTR>|n}3S3MnpQ52a*)o z!NlK2Y4LTSv_oXe3zsDln>Elfj7TD-;RtQ;6=-e49+Bg$R6=XSXDyuAu)>^z5=%z6 z)_!#QkX~qkH8HJS)C!S-j`Un6bTl#saxZaKTJgz{SX^VoC;cM#>RB>iu-KxbVKO-3 zmP?w!g-UqU5V$J}5XoX`48uj%>Cwi9{oy$n_DS_ppOrQ`Ru<hw@O;wmoNOxN!q$V3H zv*Xh1r~|aLc86#?3nml|s;n%So>N^pVgf8{k%$Mmkx(Y{;L-?#6b-$wtN=c*sw%u- zqT#~*9U4j*7p4mfBmEamOKA3?p;q^k?xKRq65ilLcc2Lg>w_ap)MVrzW-+Tpl?8~!_(#CpGkL8$m?s%zW}uSSEM7CCJP#Rn zc+r%wnvOX&aag8s-5J@rN_}P#=-7~q^6-o*lQ$AsTGEVi9$rzDHc2U?{KB%5@Rx;@ z5}kJhw&@;e6zx?MV(5j`)NvGLnB;X6VKOQd&!R!m3fTIT?n`OvwDILr##hIF-)l<2 zL=;U`)tB?&GWo+w%wf@RN<3`1(k4smqAAfJsF7|9Aul~UQ3a?ciKdlc;pfjsyLH;PuX{*M)2tQPRw5Z? z0>$(O&mN<_X-mn|9X6b=SBppzCO~cJ(d%|BS4BoP^0t&=s@X1ebXln{JJIGv|duz#G+~#)2ZX8 zm$Bzs{$g@O{nm#aBqcAHRP(g5XuPr*lvS4(%Wli7y3s00ijr~`Ni+jWt?J7QuoDtf zjM_ocvQp$zhjJ&u`1$Y9s{d)j|EV5G=7ulb%zi5BW{hdNd=`xZZfqc-3e!s=TlG{_vgXKizNhd;J;y;r>znDgG+|wf;r^d;H7& zPx{yR8~pG2KlOj-|J5I7_Aq;zrXx=7nwzJra5OD@vnAV3w#~IIu+`fhw(Yh3Vmr$2u!rnJ?KAAl>9=P45B4}mH^(uKWXCCv{*D2T z0DV>HnB=H*EOjh%tafa6Y;!a@exXNtJKfInRX@}@Z*Z=0?r`pRc6TMZl3iE1=D2Qk z-RXMBwaOLePH-o?`?^!zy4&qG-5KuT?tSi)Jbuqm&j`=Mp2t1UdOr62=ILjc#)Zaq z<9p+P(Z_p-?;hW$zOQ{Q|4@2hnt8Q(eqemyj=-)!YalB)BKU^n>*Q zSp8A`d;K>(!#>$wX`gFfX>X$UezKq9a5}DWEMz8aXa4MTG&{a?>~rjQbaEc$obO!Z zY;eBmYr9u!<#i2pjdM+NUF*8R^?>UU*W<2tU0=D*b?3ULyKiv6?D@nq z%Kv*%eh|syY6ENzo6nwM-|HLXzrcTN;GDqlz{J4Qw7fhtJv2MCD0DaD{zpj5=Xa@{ z_zk5#SRbX==vV7=^;`At9hJ_zoxNQl*92Fy%SIiSyC=9S+%w#_x|g{hcR%A^>uzvw zaBp(I>;Ay~y}Q*N=Q+xAyeH_%^%Q!_JX1Yadv5UD;(5l?3XEekvnc#`?_ zN?=pqy}*qqCcsx)nCy!>F?>=^)K{q^dI&8 zdM8_VTTj~ww!XFjHoMJdOSheC8)+M38)utjtF+Cq&4Ruxv@NkMvpr&a(ze$2ifxna zJ==EM7q)L~Kic-&I@!D1d)iO1_q7kO+wDGky8T@HNc$N3IQt}4(hU17R?|ZJ68kdy zBlailYwfStH`(8_Z?}J8|Hl5KeLw5GyQ8P$1V>+}lilHSq&v=ajC71~j8jxIv&dWwd*IB=I-e}#eJsRaG&eWagTQAyNj9kweC9i9QOkEVt2iJg?p8I z4YPlvdy9LUyUE?`Zejjwo&-;#C)tzYN%iO+!;|L8^5l3%d-6TSo(fN`r_M9Sv%s_1 zQ}0>fS>;*dY4B|HZ1HSkeKdPoJgw{n2}YukY@`^ehHe-}nvrGX7^97Rqu8i0YK=N$ zj_Q zs(rP-nZ7#TY~LK;d|$nm8~xk-JN!-lo&IM39)F8}pTCDW&~%!H zX_{$frkQ1Cvzz6yo6Tk~TVO6S7n@7XdUmuG=1Oy&xx?IPHk*6Q7IUB3Y927PKztx6 z;0&07v_NJcE07(?3FHMv2gU{}0t*6*14{$-f#rb}ft7((fz^REfsK5hvn8;Pz2QJW z3&sZ%f<1zX!IWTHFe{iH%n9ZNM+e6S^Mi%KVkrCKV100Ta7A!sa1}IuO>kYXA-E;j z5^N0~2x_7DP(r9jC^3{2N)DxlvO+nbJa*Tyq5M!`s5n#_s({Ka53LNX3at*UVYh7v zZD5Dk9BK+_b)2nNyiJ1MLr>I`^klt{o}%|xoX%LikUhARUAS7W<(ubq`fPovzE0nu zZ`3#ITi|}S={w+ncIx}|BwHU_imksb)iw}b$Z0d+hjMHcwp!avTOEAR9NT<$@I|)8 zwiULGwk@_s+cw({Ta#_4t=YE6)?$md_qPwU>xxG*?P>N*dzL*LK54dnzI_24(qj8k zdp-O83U;jqwQudQx7hdDTkQwznj_wk;OOHp9hr_SN46u!k>?og80*M~3#fK1f(xj3 zEO)GMtaPk`8(8C5=V)|%?%3^Ub#!5eOLb;BbDVk3(ay2Xd}pDv*jehVaBg&Nc5ZPt zI=8_iG&x(H@va0{f7d{l?sB>em+4A#WxBFl*{-Fob*>*>`&q4Lx*hH`_h9#V?(N1P z?+4xS=?*jiV=KbblfdIAq64dH7sYdhax%#E>t_il!Y=5^u?#OTr zfVMp0{?wiBneTbsv(+=$xXt+7$n##}UF==zt@kcx)vi3ux^48n;QJ7MXRN=17523M zpZ@M}f^mUffr7w2fsX^f1$qSg2S)`b2k!|s20Mq2XLcH)^P&H>p>IRlDotBXd-C-= z^~d%5Z2N4FK`Vc;n~o<{a-_=*)0k?s|}(e#7;)tI2gH9NC5LDek-6 z-@1QyCwWfy%4zDlC_b{u9FK7b*$|~ zTM={mCT8)6w%xY#?N`}*z;QM*Zbvy!boO=noP(H8rEuD}Iq!3R>5OCE_+2Ah%NVnB z8M8aw54a0FRh}0-?|8oSoC6oKz_=IwW0SGpi1QxlJr?TO*L#NdEUz8<8SrL!&-Lao zx|cvlCwQlLtGrixZ}9%jd$;#K@5A0Fy)Sy#Lq|V=j(!a#P4=A%x1#$7`LcZ%_{w}! zeOJSoe(mc8RlLxDhyNL<-hO{Fz3?|?Wl|s?TGS=z3J!yZye>EbEZpQr&hMN@y3S%9oy#o$o9iCeW3FdhZ@S)h zwYYwFz36Uq_wXF&>FfC`9Cr=e+hd*=;fmk!eCXNXS?Qf%USqy!b_yH^FPsyo4%7x_ z2I>N{19JlNp|y(+Lv7au8sL>Tvg)=38d-Te0!@5hxjC@sFf=$Rm>lc_CGHtV@lw0VwQ0>OhHYoSb z(4J6Bs5NvTq%}dq;hW?21VzDxey8dKb*FCVLz%Ic!699x-w1!SRDVc+LVsR=S$|W1 zSN~Ywh3xv9-UaFP1lwu0bKr|IZRaDoj&x!CTXL@WNw`UOJob4IqxzsbxGli8=>$%Qz6XSlD=U&fpt(m*)r1FP;OQBaEYrp2kT=KR6YK;f1RornvgcjUr=`QDa;QuQJcL)wsjB z&v?jKX*_GZV7y|yWxNl!@};rc*lYZ1oaj3PUSkNWWCrWx4&QR$3g3o9xQji$7T-Q! zD_n-=kM}3|d-xOmN&aMiAAgGCI@0{36%|~d_=|d^;)+Xj@A7*E&nx9TJL(`a}h2a^w zNX^N5H7i##ADfwl`>c7`qR1sepUgzzCR}<3TzZLqxBek>?RWh&B*Aps#kP6OsI9i| zY`yIL;HHP!r`msqa-7BfoeM`i-7&{;FFK7^6-C|eINEs<6eQnSj>I14Ivt8}t)duD zyZRd;v=e*$UD$Q9%qj3_&(U99=&1|Xe>Mf~VrRWC_(1SsB;zN7PY0h1z7Tvl_$re4 zTfujO9|S)NeiHmV_*HOs@VnrzNat~y4$WJnuhDy=!I^8j-}bz1p#41i2z#!5l>HL> z<@WLRiOA07_A2`{`<2kW>+Cn$=h^>ezs-K9{ciic_Q&l`N4c{KN_VC68s~M+8`%T? z#x8ItGVHz1`<)LtA9X(NdJA$OsG#oEI1o$PJ7NToSk(J;hA;P)EoU z@`pm9jL^`~d7%-Z+|a1dC85hh<3kfelSAd9s?fC1m7!}w*M)8j?G0&(aoSk=%WJ#T z_L?mLs&EPY@*}#d{b;W`Il3bA9F5e|8@cCXB%jlv6lWv-xRHN?NI*jz7ou}`2yX0M z$7*yj>(Dc7=)iaFMDMW2+2Y&>2X?@zxr7U|yN0>)(LM}zmmv2fc`ovlBhf^9EgAVf z#pn-37>M-ZM1C>h2r`jjvXNr)kYmOo#k^&F1*i0#_XqDky}x>Y_s03U_`3Oy@*V5z z<@<~8BzDl#e1G+w<+J%*J}*-KgUIKPA)!BmjQ%20`fJGPZzHL1MOOb5X?+*+`d%dV zpV?Wvn{Syqy#MxqkGwV|1crq5ASz5N$GT8s=!TT;;5)PhG#ddZF{maew9B?f%aFgZrQEU*WLgJY789(5f8k z>E-#0=OoXmp3~Tw&w_HhJYG*GvgLDdjX!x3jdPF)n~me)Te9F8o4mgu*Nyho`2NA{ z{KTjG^ZmE`pMX<*&i{h{W&f-GH~eq;-}Qgs|H%J||8xIW{@v&le}Iqt6<#gQ>|!2o zo?{M%GZ`Md0PgJK;HANWU{SCnI3;*RuqHS?cvbM);Pt_qf;R_mg^#`~C=0kA_GOCx zfxd^GEseQ(D>D7dwga{^;8ku!U$`9|>lbKQzd_IX?`CTn{7eCR*uUq+|KWPV^|b3I z&q;=xb^E;03oh*y?@7KheVx(0TpE}fxH<52P)m!`k{H)|{UvDP_xfeF8YH77wksT; zIo3GWyY{)N+;6(yalh~W(EYLdGxwM7uiOHUxg-oX6!L~ps6~O zxqBJ?dFYBJLJO`(OSB!1_gC`_Xh0}1jJ1DppfFGd z?=&}XZ{X3uQ-K%I{=5!{^e&pY9f8jSUkCOgpZ*qzLpD7+*eiGp`lWFWIcL=YU6Q|9jPcrq3 z^{$R{919#a=K{2ji=9iI^>7lqoUu~ZJ+7Br>s_zIE4~A_c$)i0&uyM1ibr_a^B!7^ zAE2U1MqgI^Xk#Wj|2@Wo^jU+k)7WPuBPoscmU|b#H*Y}0r=i(1(dbz`@(sRQ*#GbG zJ?MMP_l)mFX6)O(t!Q+A@pWdm?~86>5ZZ*B(I2cvS8x)$cO|>_BD4XU*`vD!64{^I zcISxvU&W+Jw*D?!Adgc5b1xFeYJg!eH~hW&GtR*GypvuiH;;J0GSqw~SK&2J1bOJf9JlAN~SazvGSFx+qRpF|3)w*W7>Rhv3x40I%R=8epz3gg4lHG~C zv(I$^?Lj;?haT=kcM_I|KJFBEf2O) zjz!ij^cH(dy%pYSbcZv&b>7)%5a*+lSQDc=Z1iqpB{z9@dYip_kbd`hTfGO^b#(NH zrY{X0Vit06jxUdWXsjuEM6e#(bQFi9CwXWr#vWpStwYN=C#q+xhrYaq{(c9# z#rfzAS1XNSgidThD%t6XclK~5I+L8q&OXi*XMc2v1D!$FaMt_+^k`qXyLu)XS7T8f z?0wq%4fF9h-<^JsITU?z5z^ju$SJ(67fspBz)ff*J_sBg{HxLhR>0BB4c?2c_e*pJ z2ZP;1eXyH&;KcJoQ{cR3hwep>`&{Tv?4^4{zoEa4)7C)7yQ8%|6^cEaJ}=Uzp{re_ zuSQeb(1B7r;fOA`mDwJp7cZh8Cc&{^hvi}^7U;D+^LIS+DbUY6N0sA#?8$T4g@1Sc z)#XO&y1+Hrb+_wzSA**^^fSM>kM;CJR^Q_(VO^i)o#g%A>-80}cYfqw~GQ&{-=7iXQg5AMZ} zgxe)lk6q~C!?xXr%7eg<~-s~opE zesmn;%yi!FJPnF{4El>g_iFcM_e#%Ko(0gfi@jGshd%dpL!vK0ieG0sk*sbB+#Yx> z@K)e_xS_AnxgIa|u8Pyv;Y>ke{-N$dFP>}jQO5+dCVq6zld;LCBhzelZFB8mH)uU% zKRDfeHuS$x(f(>IKr`6^W@81Kj~!?{nz6kew{e9r!0Yj*doO@y)_Sk^-tO(=J0H$w zo^JuR$;W*k`M#pB^86QL4VmM=6Whn<=p>GXzjm9$;00F%YM={mVZHl3_!ngSx3Iv` z=mu+?Hld$gfwsOUcHEcj+n6Ua99hm~&NEz3x<aRy8jpg@`FngK(OdHnmyONxvg`xS5mtD-!>2Kz?%fGze$TD1eaz)mdMmStc%GUMg0r{EN~xpui8 zcCSO8iTC^i4bsn^spy7oH{LNmF)l=tdNZ+MGS{20n{S%$ znD3h(njgbEf5|z9Z_V$`pUhv-OR)8_6>t*d9oy&VPkVE6VKi34O`P?3kJBFi5n1Fs&To`BJ?Q9fb>HoN6ixlB zNC=-GpY`_Gk-siyFTc_=5B>M&p6@+pqY0aUMSG61*7%$EcwfB#7{A{fWL|*YyAVCo z7G z;61bstwnBqbCtQqY(Oiv z1&vq}R<{-`ZdxD#jyqXt#)R)q!{(NQy)B=evVvW*4sGxPG{N=EY}qXv(Ee^g^V_8C zZmrnd60o-=qvuUU$7?9No9M{$nTxVd)+w#7*xgoOa}zz;MyS_k!EfQayR$F;uh`l4 zu#!4y^RZ)h;UjKo?20v<9(oblyh9&o%V1t~!qQc3mwjmdpYXd4%<$c;JI&F{VJJJ7 z*to>PCERTVcCK2-Oh=t#Hhk`U#}dwRta3c>c*!CA)i!9^en(GEzntK7I6Y23GwLGF z1XVhxaw6zfXxv?Jv>TwgV(U7b)*#7sva2sAKRnnma$T3WDqT}uGoXuixR$t9yEeef z?oixpGZaiX+BO=Nq%0;Y?`a^ig!)uOHuu^Bj zNsK*={&+U4X8s}8>Q&}yR?s@uP)FTzi=tzPw_E4KZO%q^UE0BN-I4Fy@gKIO7(vnH zj1AjNI&z?ElvLZK>?M1Y#iaER>vn__9f+jsjOwPdLfP$X-W5tqc?UY`4cJSzD2vGs zWix5UYN91}lA}i2bNVRTQuh8qth;CI-`Y>&JjN_Ek{ccG!Qma@tb&SO$^QAEufRV6 zDt3+karAq~nP+lBpay-)F7s#j_H0hlOhZS~Gk8OAUhq+&sVSYrw5iR5$9+@(ne%IB zvgconMP(BwO7_^!MVDM-f0R9J6gKMHIJx(s<9i363v!-=hWifZ3g>H1A1ACnb$#h7 zWVKw6o%2C>pv~A!j^;emb({=)!1&te=N*SMbeH#ew3t3x*^e3Y4|HkU(VQL4>4n?O zH)vmKz#ABhHgY@~o! zYB(|Yp70N8ozyqYPS&5p(sVSM^v}^ze!}^(c(~^pEV~<=Tb(~SN4N@HSG(45j_f03 z;`o0d30JvqaxZk>>;4Cpr1hNn+Kz_opYA{0M|w`7O?y52J?9#;jF0G@Om?h8rN`$u zbFvjXX{)!A(^)7?G}-&vok zU!&iwr`fLN^g^;d4Ndl~j%OVoI}=?&&t=Ak#=Y47Z}QDU2K?Cn2R7$HW?A5};2$zK z@;k|q3#||G(E^V4_rBvj$NxSW#k0-Ju~jWL|85S)X3!k?fqig% z=xQvK6j*2V&56vOd-XW>v{u{kX#E|I-(B}0EA&R^@ORJA-p71*_|Jp8IzI4OAQ(I! znP5k7PjC?{l`%dx!TPH0Y0E z>v`V$8a9d}uuTkTcLwoaYc0P;ZyC?*c60vW0{>-Duu^}m|7tk@r_oNl&06hco@kz7 zp3PZ^W$;+5*&jZGza5B;(H9sJI6v?b+TgbWA8~#)KG+-0dlBb2rUkDFJ`bP1D`*RO zu@s$$WcoMG@2!>btM8;`Gk#t4qx9qSQ}i?7+{^S^;DSGgga1kIjI`yj{c7v1PD3AO zKi+>t06vA=jgvT7Am(Eb?qbpZulk zpi4Ax$>`nMv~F4MZ0sR&Buj`-)M_Fh(NxFEQ4m z-|7ng@s9Ttxa1vB=K<)CYoL;vc`BzluSNdv3~kQiY}bp}B;!K;=*_&)Kh#NRZ53Zo z#ioB0cKi{@^bc~Hv74>hb{jUvhtz5Dx9uO>zefAn6}oT=wl#wjg%@)6;wCKdk2}^Q zyT8v_-Y+=|{u5`xJ3Ehs_d5kmg&poM4f#43$+N&Y!CCFR3i_peI8{Xz!f^L5WHqv$8myuLHLnqjZta2j!+gY674XHCR zmm#lIV3nHXyV1AEcNcr-qv!x%;Oy=@jMV48y__7<{9QP?dpy?tzp{q>tfJwZ+r6As zbOo#EI?fW_&Z*spumwDaHSkTOnoqC+evhSJcHiTWYfj_Dt_MzSn0b+T2^xYaoY%bu z?(A0c9!_PgGM`2h_&QepkKiP}MWXrL>>fBK&?j(e;B0I(Y3$k~vCbAE%Ul)E8aip) zSX(|Q>u_jb6+6dG=q~QJJ%b)>6X%e=HoSf${nJ<}~k;^{J zDY?j+n~j!yzS5H~XAW5!@{P`qou4_scOK(%xkjP?Ug+w<9^D^(^jOao{~vp20^ek@ z_5X*qv}G@XSQa5dL1Z&+(lkla1zI*`lU+q=DJd(T3$-2^=rQ4k3)xRN}exd1YL<<>?ZaB_d6eE{5*+t`BUe=*tK?Ybp<_jK4WAF zW8)szE6AwYfc7|#)p;}6(LL-{4~0Q=X#U*k$C1{T`4)k9yFPVI>NfPi@27s5`g7`~ zo~5jf8<6mR6b~3Xuz}1pBsy`Tc47#EkPnVlISUevt8H#`l8U0cRDV@R#rT zag+fGXwRg9NrmhQH`8Bzz~`q!{l>D>`yM{5C;HvVSacMzf2*Y3o3g%j0!?*QaC17e-G7DtivL1Q3NW(=I zz5{&id(4L2s+IIUrVYGOLTZ0-WLY4|@>7dbF9BJ1Eo;g;=7Gq(gC*X(>yWjF8o|F< zJPGXl`?2@8H^AIZZe(w>6r}rVg}!~%^E7kjQ_sJU!gNjRg*J0&ninnRz3lHl0=3>P z{Zyq#6NLKJ={F#C6x7Fi$g~BIZc)gVL7)()XZ#J>;JdmXY9mAxVpy!%Aj((5dAx7+ zS$iXO&PMJ$M%nXBNzB2frvPkJDU^7A16=DZiZ6Lk$)(>;+=ZQrFHsQVxgbU^OS%tD zQ4dFkW3*!h63y3<5+8KzN%@8S?06)bPEdUBxjLewm;nlDw|lSJIYz;swg+RBfHcL< zNX$m_FdnVLbf}QvnwNlSmYw4|utpCu7Nz}n3fBiFMleTF;EmdYHA+y(W)HMz1pCH@ zsG~o+Yuw!c`7HX2IPlN$&@W3`0=tg-Xr=JljLJWN-1{W$8+!Qnv^L5j!JeLhK6+Am z9uk|&(pRM4j2*&*a3`;U?D-f}&%X2(*p{q^J9$17F^AkM!q^)IGndI27y*Ai)jA74 zU#tq&p{;*~J<-?JHef%yC-zUwfET?0^u?86Bk#su;KRf(6Thd&Ba+%D_3~RMjX}~k zE9p`w@QvV>A4X&O5qqgF$Zp0UU!UHH)Mlm9P~K9fqkIhM&1WECf42E-o$WnXxwDx0 z=d)@r166c4NTL_)uYr)!=;XLYa2?Jdr1BW0mCQjGxeQ8ii_$xa&QbJ@4YiFX-!mDC zl2fO7tS^0Dg(RmjZs0j=5=>dnM`$T`W1AqF$^+OZG~}E6q>Kf{b56?np#SnyW@5Ed z#yLeCt})t(zXThI@g6fP$1WVrEiB$-cOl@pB}&Y56eZiEYeD*ahjl_)H0 z#;~r;Zxms)8Qq7R9GJ~g)79Dw>0>fBVAHU88HLqcKRCo@_M5@pc6MBn^0$=!U`v{y zLydB$3Vu4Z+;d;r8R_R`6e2T;G!8%?Pq(Im={pnqtf|n+QY>#OnIX4Z*JBazMvy%~ zU>$plQNJ6>Y8Jb~I~^yabV%ux(iNOPfsKI=J9SzkZ_52p&=vb{oE{?XN@6046t zCP}ML6I)|<)d6(56+Uh_Rv<;_`j-3`5z40RNRdL2tU$ja2px?|{sP;qW*MzA+Gd=X z(Kka-f3lC8gEihIXfW1*M|)pZMN6d79+`DFYhUX?>u_|7qRYKX=@mb~vdTa|+Y?$i zDsiH+p}G`WxF+#dbh9W>2QZ_)*UQKy3k#cf3P{Ea&qu#ImqRVfw_T@IgkaAj$p{65#@61tnOhM;YxfDiZjCgS!#9XE zNEdXIla%e@ZOE#g!y;-A=!I5^9kG9MGAGVYT#&dZ@p9(G-xHq#@%#$<%P8a>XCzHz zMpR(=eHHrV2a?{#=EaxP+1A6BX)CnNv8}*<;vux)AF%dE+FRKBuxB5IzGjYn0ekgT z3K#bXyY%<%yX>E`_8XvLJ0+)~L7s{Y^S#M$A<60trUfPWdED%>LB*=XShaz_nG6G3&LkL`}fTaYy@{Uit{ntQFYc%@eS+;Jx9g= z$nK}oZ&N5cpw(&*B>4YeRL~CA@DCL~F1)x^Sr(3EW?g_jKsfIj=GVW#tj40v9Dpv} z?HR>>ze1t;1&{s_8kQF9=}$}RuXL0J>{K>l0l0(x;XdT#C#I(}{--nU#gg{E^heZA z|1uEd<%B)cQjJR zQCR0)gVgr}IHK-o*^AI!ZS}nE5qnix1OA$w+VQObN$C!(%JmvBMPa&^vS(k9mP)kk zJN*_ZyRo49a~i=vO8<9ee2$FfP=+xk(%1;SH>@4OSEV7*o@FhuUXEXa^=R-n!wbD^ zeFxN3Fi;kpLI$u`FM{}lCa3=_In*@8tO9qy2N zYU=5!Ly?2cOT8M)%A2tG+KL8tm-5`u6+Bv&XS65ZQ;gJi71FDXXjxtZ^?5+qi?>Jm zKP7Ep+ErE{&2@!wwq8tP=Ue7M?vKl+93*i`SSXVdfNss2j%{71o6 z@5RD)i{l(;Br?uN-A?3W%h(Tg^t4L55i5t)>33y3ByCk1sW1S`(ZXJwxD?CuVIVy} zvX8{Z`e1T@ye-TJU3ar%gX2-(aZkI=`9mmF%4=b^b9{2Y8=l(2G=LLH_`&7KNXh@wUrt@NMiqt^n(jh~#5}^Hy@q zbZ>FD1y_6@+SVTU`sjwAjydcZp9VkK3VYNdbVYMAu9otzj5Nk`ISaoR2HMd=Gy<2f z^LibN?p;Z3(0T4o`6gu`l9ELr!7`A1?|031-vhesd8~hbQWkSI-Y^kV*lN#1U?s_{ zI?{+@{7gzrNt$8Xj@89Pv^}39wP_F1)17h>c9vG>Ao857JVE^Xi0=c=rmkkp{_eEn zRq%To;P-}wL1_oLv}#tg_x$o`k&MQLSYY;3-c?Gme-Ztr=wp1T=i-HDF*cRY;0xsl zyPo*8#I%Xn-~W)-msMvV_Cw#LdzJr@tr;(5e3G#rn{@gOdOrZI+jrJ9Y_Gh`mJNw5 z*u^%%s$e}f-tEwvJ#KFXu74dEjYvluzs@)ro_jdhIj`d)Y+VJbSBf`J;rfddl7fhi)Qk*~(9D2X77HpyX`6`94->&>`9G@I(JoGhys9%X+j@4l; z{dXe|YN`AQ96yJBG19N=;iR|M^U|Sd=b@vZqQqy1$hS+Gx$}{6SJw00AtO3$!c z$+zSFqY|DPke&wP#DiCWDsWHR;L>+9`}(D)f)LD6vXrXy`pBh?bzV7kLaV<6w;h8v zw{OM}v<%|sW+lFCe!`m#DCC+*V+Z3a0t?x*;n{ORYZoDryU+Rnb~RsFzlDqf3$nRC}r4XILfs#`l@)pMrOtYRf~HH_KK6YJ0xI`)NL2Q0Z3tUG@!7 z-EH=c$tUB#sV9~ycj2>X6Ug0%@u)BWtb@amjs!%|c!I@iiltwBWkn(uB%XiMex%{J zej^0)@Kef>lmLRy)Z9G-mhWXa-nY>Ie&GDr`I++z=hxV2|LFV)-v~#X5w2+0vAKs) z@W~V5ltuHG4>G+N?=$mU7osD+3~a@fpewEgUvU%C+uIe+Zxh;=hw+{9B$~1p;5Edi z_Gg#R)xq5rp4x*vcM96#ORx^R-Te?Ws1_=81m3zini`LID|u>F=CaShvldq3WDW-70OS+vF$#dgX`XL z48FTVMpr$O(OpIwQ?MP2utwvZsWnJ`;XAtGqp25OngqG+U|*V!*Nh=}YZ`?m_(VK5 zoex4NAK7s+UJ2$QJ-JlzCs%?Kxz>6Ex|X#_lkdWd(CzB47#G9>BWjT0AAdoxbZ=WLqLy@f-9eh z$EWl0Zjg`Hr($H5^N@pIitneT=y9&b|I-avVs3(3Vh?-<@y(rkzYV>p9uPAI=uC>pc-886^rn?cO5#o@3E2|g1qir{OO6$%0*z| z?(qBrsoj&v$=?NG@B_9U&G2V*G8*knDDjlE*?7&nh5gzSpyNJ4f_E4TmagfE=|k}y zRGdB!tAYEFUObIv?wj<3>79_`orZ?Rh3C7`pu5fobx;I1VC;(&_X*I>Hb|1YVmUVe zYMG6eWdfQtuXQ%`@CKyH&m&X*3ESG!6Vvc3dRgLWNkgz-n+~#P2|lrI#ZK)lv}@l( zMGhy$Ku5aRPGJ{k$HT%TJZa2AmayD*4^qAl@l4doekus#RFFKQ?GxFIGKc>i4d16;_gybXTgHn`ev*%P?X)Sa6$3+>wz zcrn_OGTxa7BL8mm7T3Bibl(Y%l4sDZ?gXQ`%(OY971WW$bQu zq_>Cj#sXRCD1Wl{0@*Y*={DOP$tS~2zeLX-PU#KGe-GM_!_E@dRBX(uu+)Cn-8VIl zvDOy--Yh(;F<9cFj7%=$uzy=>eaZSok_``_SK<-jN!yD^H4h_A?}Qe;zrwt&wWpKg zSoA8zuEC&LzD_kPx(tip#Gb`J&a}inXz~XpeQq0zx72L-{Z+|Jkk{Rs(i6UXtIOej z#oZpyj30SUNwXrux=;2{)+mMV?Tc@~LXeC9qF-$6sjmXH_$E@-R`v{gKDHCSvq@-JuGAWr0E<>zBI2sM#Ge}XRgOEf#*yQ4jAkSQ-`9R8YC z3ckpf-UgI|vc=4dQdsVDSSyFHrVYp6!2w&m{Z)H8K2x5@zk>}cvPx6l2i$BjqGb>J)v@Xv$NU%=w?ec5x4(d|2nz2?%y2}!M3QzpQl zy~}F-Qtt#zR|Y zdnWpp1?=iRNr`eUaSz4T>8jLsQ{z3g={6(*V)bKGM;XJoG`D6Tf%y<0IK8l3eaL!?82%Ar1v(BdqzQ+Oo@?&BG z9`eS60PPB|FdP29eR5XviOvzO>lhtNJZX6P9Ev@{_1Kc$ll}k*s6qH~p&&I;0xdNL zQJ2|RAuYlZ_gZ+a_3&GdfpU4-`Z`+tPw?pX6+4k%;I5j%S+#?!>Y>oPPUz4u5Qt;( zt1%56Vi_oyi}69SD)BBbhOeN>u$LJ-;oc!OQRe)|EWp)We#!gt1JSOxqD?z|bifLOzeCH(R711lTY!E34M z-joPuG+Nqj$U!`KlbMVsndyJX`rX{w>_wIz12(ufNY>0_S|e$z_oMI8!>#)*-QC0YX39W6X0CjvcJA$wd-es7CP=h`W9-$Bz2DiZyl)Cd z@H)>Fq%+^8or(0bIDKfwzpw?3GIla-FR^}OosS2}YHYu^vlkYBk@0ZhCo!HpXhvVd zKjX~g7w}}b4D0Lcl)tAu?wsVx0~vf75~h`K1Jy{9w>K(DK8&?S?_*ka2~M){R@#Q8 z*VnX66xOs3&tNovt638!q+Ji*;%%r?Yy94xfhVOIV7p(IIanKIEa!46lEKl)?=DO1 z#~i*2ZQOd+h)->Iu^QLf?bxi|jAVZ&{$C34t*`=J(92l;^km=qjq5j8AJEKap~2kg z{wlQtlE{3|Jb0HKym?{T3TVgscy5URdHN_Qp_kC4>`wn4{A2Ts4%khlXAH)d(}iF? zjD1nYcIbg%-R4u4mFP6KHn1DtgGER0I?UsTN~^IqQT97I@FLGBYx&o(Pdos+O>7g7 z2ix|?b}1T-Ec=w>MwUOK=xt)@SoR&NY-_pfkMpj{g zv<>_A_me+mrEKD8>gep~;W(95WH3^_*^I3fj_VxvAYXnByQ2fxf3!m`+)dFIZSk=X zjowv^zI#)ig(Er2ssbEEBDc{w1fP8-u)cZbnd;C+6Pb~pYdOtH!xT@aDDmNP*euVOb z+ZZahF`U$c%F6H^yjmQ=N25lWj8HbY7qhP2n09m8qe!$rV01Q5@0C6P-=uSqYj5*= zN(`sxYuw&eBRZH&MpL7TztPy44Nshct@xGLHbtP{$O3I~QPL^!#3O88yym}(HAEZx z)nI}?#4BNzqa2%_S`ZRLv7sJ^_03KA4w*u$Y;$7|#)|I6^Zi1!J2zoZ^($O#JZM@g zNSZ^Qbo{3ME$tuar@+-OVQz2D_#K>FQ^n)VMzXQX`beS&%zaM_5Axcpn;>|eFN&FKGL z;j20!|NBSsF67p6c$Xf)*j|Vo%WI%Q`Z~K}C7b1X1e=L--QQBmj&Qd_*}+wMGSEcy zz*?&dQq6fn!!q@IE{9K;1s3}6iJS1l@pj^G$V;3_eXzm0fO@n6m-29O1{7?$Ym4g% za7(*f=dt(NnEFX-Yq-VN;1u_z`O-SF8(50h)otL?PJt?|&Dexz!H?xVW11TCp-=7L zpQgb3bb_b-JD#~MXj2P8&%}dg7{vbO89exW1?7ASFC5q49cphqD`c_j3GZ1ay#9YN zGyVqT_#5DupK`o}Ppny}$!`19qH({~xmUBP8=R3Mi!8%!Nlc%@@TY3wAcekPCuXRPbTd+c9f!ME9 zYtYfx>75Fb1CQAMEnIkgw80UmOM4|Bb+9v=h%R-SvgyB7+427iIfVG7KV5lNITuve z5^&;oFn?ZBmKlt@oTkQujJxL6)8YGtPrebm#yhN!z#~747mrV@pR+IT23IV8;9OW2>2yEsnA>gs&#&eots`r2Vhv9Z>SVSN3_o_G*mm#)IAlAr_+ zJ5yY#@RIY<>O2RPc~#ka?8Yb30jxg$dX$vOBOZI~byp`L9FHHxBbsHn5Jqt#!bJSsosSeJpK}q4@yj+3TdPYs9YL%{t_JUN z1CpJ!*g4(>^5rG`Gk%2U_QN1x{-?(0p%Aa{;F?s3v`I$OjLztkPDO5(hbPXZXn{>Mn4FhzNOaDnO^x-8S!57(a`=Iqr6I`O8K73m z(L=9Lrz6Oz2(ikuQg5(|XR())6A*3%xBEF(3{5$!Mou|!V2yben3dUBt1n2p8tL1k zNl&m!eTr1$5K`-tvB*3PIkgwm${g@yk0^f=pTLoSqi~CD?7bM3lM zcXvCU!9ol6NfUY^WY0#VdwRWBNke_JmqUBZ5Gyrw}Q!j6CGp( zEA%LrSM4XaxkkDdq2;~@yU{mUY1`rRYGdkCsePeMl~9@2@V|Q%@~|WQ=n;^m+t|2Qo>{Vb6Ck4WyDn;N%Jy-aO{Wx@XJfgPkNo)& zc4b>Zr1%_eydHV*0`rWs9Ud0Whey2>uMKO{=CR}cT;#BCKnuAP1$q5fF-GiGfZ+_chDMd zx)!(>voOn0Lt3LRjoQMqUie$H=9sbJif#W|BJ#-Ib zqS@|o^uZjszvT^l9Q!zQE(u^5^6)ylB<&Uav)qFe zz=Z^`5_FQWuc`9M(HCw;PRaQUzFN+?`7JRfsV%;n4O^qORo2Ry; zwAzC7jMUrE3p|XxbPxSkt8^_inTWO1k7>=*JF+|Mi^o|vYvQQ%arhsoz}N3; zWE!uqB2GYWBrOUDg8pU>Z>GV!TIQ@YmrGsv3lOfniH7i``yz&l6;c*jBbCW%DO?NPXbtC-K*@iaR(wHohn`_fi{0za63 zHvU-*OSEx-`kid;4~EZYU7I)wUr#Hs?YDsIc-a25Jp%8eZIvhI6t#|?jjpB$Un*DQ zo9Rw`96X4{%X|1{+QW{>hd({>5+WX+8`||%sq=&c0TS$uX*c+H2y?Un{iJaA_cNW3Xt>f~MX#Nea1)H(CZUTbtEY{My z(sprXNDBL^)#x}qP?i-LMrO1+x37uyR!|#1D&N-Y!9TZ1IuEaA)ks3FvE7SbrE$n3 zzC->t6`kU>jL6O)kjA116MaY*_R}+zH@g=(>%*Y6bHFdYgKxuwt|@rWSd7MR7qqS^ zo=Z|$+popq{$=D$EwKX^tNSuMFy5SYr}AgLHSJk^zP*Y!qFq={ehW?cnO)(faMo*C zjo-)b|Kao#*a2o?{dRVS7yp`-3JbUn-OV=TIZ9CAemng!(ds;u*7ZD^E{AV<5Q*u| z2KM`htvA?j!rJk6g}>UQkgt!~pF|G%0@9t=Ky$xSPa^pfo_CHgpQF)yv`#(&?MEl& zb*)!&pX32}y?5ZfCLLMj5VRqqlE)@bOg;w=Xc{ZyOr)1($|KvQ$(L~^pTtNl zkU_<9?m>Kr_lHd9S)8$00Y@)qQyzA1c0G$cqX#Hi@xjpIx1f?-_zNgRBJf#a0o+U!nt9nT^=J2=jD{@DHV}#b{k9DB@n_lJL?al%Zhs1U z{d<{7_ z_~7>VPbE!(v#P)k!7E7zlTO2P;Bqu_-`YAUi}G{906buSj1#XuM@o1|c}!}R+>O&) zoSbtt8vTC(+*c*Gl-iQ=LBE__TU368wC%96vH5qUY#00enXXnC#Kv*5+ZZE9Qd)t< zS?3&wpO?2>tHE;20&_AHsqzPDaiA~;K#$~vDcWUaw34fKXNU2+!ilwq({5%a` zOhKBrmA#}Ju6HNz_c^WVpvS0R~yIz0-{HWN98@_eMq z`Pjo<%^8$8fH_#pIh1#C66Gemr#uYL^&}?}@X(kTg>}D~S-dgvfy5^{jpzgR3&~hg z?gg*%t9=LdygQh^wdnp1uy2Y5!P*yTfX$iWOyvyKta{$Y$ulR$i0ATH@|{>^Jm7f@ zpCa4w^=g#rb}E1yn1@&0XxHf=AjYN-zz%PwjH}8R!_K9RBNF?=XD9Y^YDo78my4F zqnr93xkeP;(Dk`p;eAgwv^2XV<37$fehyER|I+6h*Tg9OulP4^qt59%lT*58f`?s> z4CEa!t*7AaZaSU;n}9s+ku-*Lb*^IfekXgG!%6+Yg%0Hu==<^QdX>Eg7BA1iLwOt@ zvs=9le?KwEfp3DRoXj5m6SoKXKp{NhWq2PS>$%>u%QG~s16FlY@bJ7z#`7C7>O7L6 zAairk0AFvlfSUa|u{k@z-uPpC5|7H?CY`}r@djQhC)yvuhVxDAcLs6t;boj=w;5~W z2>5I(9Na?A{@uhGydN>L8=gCGAyj)R{unQXuH4LC`ayW$dFsrq%Q(H{N)TOlv7>zh zeYW^yI$X~y(SqP%CUQXX$Mt=eyg_TaJ<-tHwh_|Ng|6@gu$=IMGLr#;J`IY;97>|X?Ra|Y6! zPx0~F+<)4vwicKD*Y$W&co?+k8_3sA^>oK$_C`ENzY53I11Y@+X@t;_0_?FWu=_eb z3UVx5eam`hE%ZC8huel!W;s?SoTjrcM&V_SB(;IxOtfX;)3yQ>)>=GnypFcXzz6gI zw6oLgm*b~xD<_&G+e30DuK048n43!aIh~ksBiao?F$O&EtX?4)i z5o_ipoP2a1=V~2vo=n@8u}(EdW_S(~()-}5yyy&HL!*2${Q4IBO!h=p=0x%=?OMZ$ z@TY*d8wH271}fVbtn68w5qdk?I5=xQv2sL^(G#EjZ=+TJ62Dwy)G3AA(6+VYRAxCj zwm9ix_@Jxta(4v3Hs?UC((EJQtS4}ii=GjM_SqnX=3<||3f=S*?7zOi-$+aRS|@Rm z>ttjm*MTcrPaDWNlzX9TCxZR3Gy27*>k4YT9$8NPQ<;848X1WfP#fNhmZJN8CncKE zZo$)G7M`l7IE$V0oXglpti?Os)9hrwU=<#KJh4c5>0hIKd_Ds~6Pd0!|UT30d^x z?3G?Z68#C5%LkFaD|C)ejpEUgWoUP7dzk>6b`q4J8!;z%ohkFvS z0iQ&R&~n`bcKUv$P56vcwz}e}YZaOVImz-3&K>>+@3i74aRQ@e8Ip--@J(|sC<32t zoWcfQ@28vhBEx$KWaV^D-Mtepv7e!njY6h$K6a5?IQ1YCk1oqnZbWAE7-v(y%}K74 zIsfJ^=R>T+yYO2XiH&0dR{J(;_=xLeG_jqLgib+*JJVgl+II&C;rD+LCib}GWBO`YqZ&Jv@Us| zIxpc&xpj&6(pulJn~6$lf#u67NaD_62YqeQy+}G=$76N`Yg<3|R3q3?m!O$hZu`4! z0|=WhmB0BGc(m?;7s)eOjTRya5l_!QV8h;yQ|J0K)TrNePWT;4;nKUpJ11>GZ%jeUm%g|<{U_iPebl@i}OBY(r;iX z))_nU$;_=K@EHGqQ{IKIoZno-Y3qNmw~GYra3;9%D)@$7_{H(Tt)7BDIg9pv|?n?g&ytNA&RR}h>R!*sBe-mr$<$jwq*Z}p% zlk{AL72jlg7<#?OmSA6k1mZU8_ByhU^RQ;SRLR*NVV*q4>g7cnumBzA^Xja!uRw8i z!9U}fAi1W1<+=&1#-p51_%ro90ZqAhw_fbIioMAe&u;vUHcjiwK5PzW(5zsDZAM=a zo!$=biFRnnGW_YSM=IM537L2y@uI_fG2=twV8_H7MU0^)oEdfkCxxfu4{RLuUCW$% z7CWsEtugq(>7O_di-oc9v2z(sH(;5p&yQ^jB5QO~0UodK=CsW1=o=zzoo#2~3BAyE zJ*PoFPQ5?C3(1d23QvHm$>8jZMfR(a)ZB-*=4*R2)H)k#UBpi65=PHG=x%;wR*KhN z89Sr#R#$+h=0~7Bg8w}k^zQ&>>N%iuE@SMhN3Zi565StDnj>dQ;l$WdJc!=P_<4~w z-s9|xG+-PU@e9C>-iF`I_nEaVLC_ANrI#tq+f$r#@teC9lqnOsbYbe9oNMtG8kqg; z!cNE6cMclbTR30(eJJ-~tVd2pW_otoEN1aqr2FqNcRQo$9}fR8my-*(pqcrM8G8aY zF+;HsDPSGH9X;L~qN!n@8mrEZ>5kvE@n|U@#TsrWYvA|n;hQI(glG8-@Yv@tXXk># zUWpEW3uyV*IH~0;^f|52sr7(+mC;s?FWA-S@83x}!FCA$e z-G}Jieo8MwE3=H#iQdEB)hLZsdZzYR1opSu)F{cvN6lvZK}WL7$YONNN_-sKjMwpW z)Y+bhENT+`>JRjBM^I`bp%2$4Yn^`_>&Ka_u-D`7?H(la+f)9T@)akP^x)LrGdK_8 zQgBpHbFSE1*o^*wKH@a=v`fJK-h;m1kvfRo!*b@rgIK@s!dFix^yr1ySl)_WVyhNZL2uxkh!+S~_4R#pV3C|~ zb1Jf#t$4WlIPnMejy6VI9tI%S- z2qxqZ+{Epy1ijJHTnuXaHn19Rv5)-$?MN3qXpiLFwj1EfAIB2rS8O)A!xx-~1m-5r zJg8B=6gzqPBYUZUhF`onNG{ znEo;b!ii`?mJF6j<$7#C+~wMD}(Vc5(};K6jFL2 zbgvq|>U+HJ%T5mIjk3$b60tY#$zu zTA=Uh=SXFbb_u)in^`+IBH?@*8RzSc_c=%O3vi1~(0O&|%+~3guYEDzm)BsqwFx~} z4JT{A4)^jAsKuX=u*N%2bx!02?P6qsSAcz3i%r*NM%+`#!FM1@`;xPWW5EbaLML7b zs%8tGE1pH0)dD-ali5p6!}nzcwDN8+v<2AOeU3#;AI=V#$*Df~GT)vB8yJb4XJpz% z@cX}VEMV5aBdNP*>y$o<#2Et@p#&YUCeooS>TB-#5>vw zG$32S*#C>x`59Da45-d~*|)x(@)?@$pWx(AV8-=E5He`ehQlF0QNd9IIklIz3W<#0cW5KxDAY! zAY}%^qqSsY^@G0`pH>0yt(P&zs-ay^A_X{1mOFDyyA58clb+2|sZ% zdzuv1p(~yDz^!cqnermLy$|6?k05nz?&^uwe+aVnOTpFLhK=8c$~LtnxQM}cZM@Na zEAwR|GmMp@* z(9N9T(2BLV6uZj1vG{rnr0dJzZ$8F%){kg9qmeIkU{}yLBMnM;E*Pjv=zP_2oJSq( z2XPN5o_*$d@3pZCn;>|@*hbEewOZ{~C#Z}}>{^E@kILhZ^F+vXXjQd$t%kNJAE8~_ zP46~-Qe=4j*N8vh#d}@Q`64x}YH!20i+|@|5{-SaMn7bOx=vQk^~qE|!Iv|?Rx!SA z!9pqc>21mz`1VFmsXV|gv@!nzV&5zNAum>^fvtj5UZ+ln*`{QUJC#3OIrsK3I>qDn z5U`Os{h%$D{a6ks+lrlkr8?PmHD@fZ#{zgOxUlWWgWkjTNW3$NU&&a`3XjJIueV-AxVrOFp-DzFqlmHMbcQdjSfsu2U$@wQ z@F*wV{^u;HZJb1g9TI=h%@@o8qjW{9nMr9kbgx#EJ=h;1UMX2g(Oqq#b{Hs|^t zSJA=8a_m=Yu4A~yaV_A=#R%jZqw*zFmG5epeEmz6^5Z4&4agm|< zv>#tl3xcK5 zS0C3}t_B@&NUnU$_K)JblXAyJ8FhuYZceu zxK?vL%ylc*-?;+ks64`T4_6;o9t+7w+UrX4kFOVxbWOK!Bk@v>Vbb}0%<@Zm`AiNI zUl1mKewg^GF!8Iy#IFw%zcoz!_Av49g^Ax2CjL;E_}Ez091YqhK1_V?F!9bX@x#Kz zPi`c>C4;M=k$5TL{4nuVVd7VZiC-TkeruTc?P22I3lqO5O#GoR@v+Uqw11fR-eKaM zVd95{iJu%Mz93Be{4nuVVd7VZiC-TkeruTc?P22I3lqO5O#GoR@v*Y_@TpH9;={!E z4ioPT6F;nxcp2xD!^9U5f6JK(hFy~>Rkk-qg#L~i75dvbI`ntZn9$$VXNCUWIX3in z?DzyZO1$p#-h>2WchK)`lS1z=KRfjIlygIW_d752_u=zHfA7c%{e8={(BDPVLw|en z6O27|r8A6#83~3tk0p9XNrEvp=)R>iL0m@!K64Y~c-6X3<^>5xRM7A21qnvWp!$xv zFu{lyCdL0LSV()AKe&#lOfZH8rC+ru!Ke=UZC{)qrXzKqgez$8pz=)qTY{|Tb)P-g zB#2pl-Dl4Yq5ackb%N5FnF(UoBp6jefa-b5k{=~p2gi!MwT&{7@azcZ=;QI#6+tU z!_>Vo{`A9*p`@4G1{+c8zWmbPMjL1P^N_paNprUUjc4bZ%=aDGoBrxBzW zgLk7AMmFDv^2}gkBrzi>m3)sTej=rl-y=vhhHDmY8A#f}{ zMJnn$>lu&{QID%xR0?lP~BV-U3>NsxuXl);F@p0SNjgUcT z4bAvdZKkWy_+J^IvbMxlvI)+F09XtotyaZFQqu_j1z%NKxi9G?y*ww+2M=_9QtadV z{7$k%gnbJcI~lZZHywyO45g?aR9Z8Qq?hO9dC4c}6KAwOW}8vWx(|=meLw1#$XY$u zWWGu0w9zp7Yygmdk6~QBwX#V>b*5a^Z;6-tW?H$*^I<+g#Si~g=2~#r-OlHGuC33v zBu;9u5b~NKSM^)s<$iE_`5xvY#X8nF3obg@1pjRCJ?1bZtA6lcWBQQ}O}8<02$2{6 z2j*tII_+aJ9Zx7Fos|$r_;==}%#Z(Mn>A>}dJ!^wS~?9Qz9n)NcrekS41qVxg1;QN z$S^XWCgeiD5}Bf%pp*#9ByH>Xz|gDLRLA{OhK@<%pMBcrTfEQbTg2RpJG9UjfAKX&q*{PY>N1|NgCDl;}ie<9A*cCif`GCo!N zZGZ}FDlT5fJNK`!We~68+AhAPZM@Bfo1y)O@W?3n5z$u1*;Xv(j>Ngz@*z)>IBlH% zByl8^Wb!cYSghj`buvjPDOEZimPb`WzL?MY<5W`pj(DA)jXOLpao0%sBq0_%6j8@X zJ>QX$M?Kq4(n{PRl~BEdpRSJlaY}x^#bz8a`s1w9WifyIubO5g(Dv;JW`AD% zm-MGS%Pb2O<|Absl;DqBEDfvT?A^QTgfyv2NV-AYyX%D1P9-!9d-py%p>scdE(r}I zsr&7>tB0NY7w`ASx%-e%9(EpLaLB_vdwcipDxtKNN{BB|VpKwDW|hz|y7zH+PmqKw zoT^8p{cpd+c6;|T$dU0PNoCBqZ8n{dBI|^@{UxEQizHm3<0N4ZiX#dAW6LHvN|e+? z_c32dsG?Mk`dJd1?X^OWRY~FQuG3LN%HscihyTj>3iR>+%~{+3S9A8S?oVeGp9_Be zdD$WP!d%HPjO^^p*ec(F>}-jGvij7x9yun)cK`}3ADgpE#SMPDjl?mit7Mw+tj#v^ zJbzr({JJ>OeZO0!TUHnMpHJ8Nh$_o5-`g-Z5C{>c&L#&%O+w zZ@;t^DVlGnu1jdf)uof{B;9{=P0iQEv1RO+FRF}=>^vRmH0iC)mY$!b;~+Fj3Bc#-fGxNigz>IU4`8j2k*6(fX9qIYg>-j4-oPizj>M(s^PzSmV*Khj+jqpNqU`5}`QGoo z`&{CjD`26_IEj!C^M$|vz5cXk53$+o+0?}+EzKY5vSA%x`w&;f(q^m5khr9Ec{vBklS_K;tVs+HZx&Ewv<_3iW@hb z-|ZXvsItgA{AIBv_1PfFB%zWB4}(F{{Ws^Q|IIdNh?TgD(&kY5yu%R25le^X;!vZS8E^agE|1WehV@ z_LJ_Kj@Pl`#mj7hyJcWYTsxa>k&0t7(E-E>3(ezgnGH~2+oAo?Zx>H3YJ1%^i{UCr zws?h(BbiObk<8|gBbkmPnLkdFsklQVgLRd6NHX38Z$>hwO?cF6B$>Qv1<5iF>GG+< zs5t23V#OoD16M5)-WWH)Rg0N;(gtg2gEi7FRqPjN42iR?S)-!NMpJQ;Cg}4&)1SHk zq2<}HA|>uG#K9r3C%dS=8fr88E>j7$gzk2%Zk7r2KHKioaQ^s2zC9h_NSi}P;*hy!lW!V zEZwuI#R@0IQG3m#1U4+)sh$(6$2^v{N$TFc&jzTbtS+!q`(>;Xr&}BDNVm3%BOBU= z4&jSx8`9A%?(8h5&qr@E1=w?J*swuWUzjxYrLGOtFa9ts%s45wA}A#0Sy?jN?5TuM zNP&<^=-#-UxcxFi#rK?I&tx`OG5A^}pJm!7ov4A{UZi$`~s7 z-uR~yc@cMz52*`(`KshaA~!l7nGuQj*bI@w`}SGYm54}w@0-8OuyKv4`f{IKW2=@` zs_PzojrnewiYHy9#H$%3SKmHc$nV%l|8E*b-o{Ux@Cg<|CZP#>I{8#asf+#-Bv;{% z`d`1EQpcK)YK(m^-(~FJ^=ksAreS||_kYltVn zH&Gtq3A~K*5KmY`U>n3Mi6=ndd5m}hyCcd&JV8c`^pdoUlt%t>gR+pF9(FRsCD|AN%&MUB-k76O0QkxIhI~QiFxffcZ4)IaAO8a(F~L7N>yQ5# zc{b#EgWDP$T-$I_3!Nzct*Q$}nxBv8g8Q3a+|C{RP|EKO#T0Y_Hr|yLQ z3A|rF7kXDRH2Y8G-N>KgyB`>h4Zk&#Y4|8~z6)znwMwWIw&5@S$UCy5fE)4AFY`1R z;eV$fi^jphj5BhLVxwGr^BQGFp`xaeC?baznh)6^)R?=t`IM4tT$&%gyni80;q z^6aTbPx3gGZ^gtFb1gUK8m0UzA$Y&*n0VbM@>~JA7n7@*PU7-as;~XEIMzGub?quO%co>zA^j@ttJ|rF zH%re2`mcoANLgeo$q14bl9ra7q>g3$lXj7Emy^rzKlui8tV+wtyXVpVlJfxGIZ?$( zIrNB=kt`{^#)ZVmcrB!rWSq#Xkv@>NYSX;k0pCnHi>v_Df zl&jQV-loU6lu6n~+C#UT%(}q+;5nenA#axyx))C6x%vLw17k|Jv7|5Oo`up$t@HS% zN0p52;GQ~N^;hCi>!9l|w58BrgCg>^Q1V>Wj^=nfRn<&tU8qLQ3{qQ+GeA-f1|!*q zzj_SlTAJ||qX%V}4o+bR&&ljD-_lqvej;|1OB|R?8ErDVq&4&i49q|;B^kjxrg2Zt z+RzmFc-kD#z4@wVg2#LKC#38$7N+wynV*f%o_6)}4VSKENN!St*_5Z4`n0N-L-4(( ziW19MD+VJlh`!OSZPs8q<3V~*dQ0b5K}(G0`!s($$$Xc&s_DHAdKU|4p3VF7cuM-Z zj3_eF746#U+zY;%Io)sVS>zYDErJW>y!N2SA z8AI#LrN0XpKf+@*qYb2o=kQn77Fpc{g>UwBaNdEreyrArqO3)fvaiuK>?)xtnXEWc zV{;9YaVUL0LzTOq;w>z+j-(Nu#%uIvJm(TL#Sg64(sKd+Q}QwSHL1Czla=Ct%C{Vp z+X!N1JqnBbse@=F?}xsfMno zQYKwbv;EAL)?B&d**M3k=Zof4HHDBi3zX($e)T7uLpd}@rKzyc51~_frEi=g>+OGb z1nDgBUq{bDXnUZyb-C*EWl8nwT|}NHR}|=LbG;KDIlv#8HI=srb=5OTTDB+sJAk<= zGf{eDihnFfuP;#POd6!ySg751+>T2pKL)t)d6Y@$$y}Z;B2BJZ znT6NXIhp*bJSk-hu8aKEB?v8lpyd6+&QmFCfL{)sslv?#_85AWnR`0Db1FBw1g*?^ zgqZ7aAXm*jgmRg}lgmC)b0?usn!T&%u5JfwUriY%4n3CEp#lJ?=p5|27A@7 zz{-wSSklN$5eg_gOCV+(C6wJ^BotlB6vH|r>&XoDOL7{@vzpe+3NTFlsvtg_bb5Sw zd0M!>a<0Qwy_%{OU+8EV&&Y~46DlsejFhm5@5lPIqRnNkld&peTWG1tJ4#&x{Co@b zPFYn#cZ@C7jFP>ijAU~>=~cBCwUl~C8NF1y7lZQFc3lH0zwo;<4$3HTFUp}uS_}1k z8g&tFTk;WlRL0uZi&a!45_(OQxLD$btJOzJW#%-Vr)0<9+W$@qsRE-_BpE{2TT_x= zs&v6SCi8Bz|6Q_*mmRASx!(slw#;sGtOxe`nwpkUI(e(b2+#<CFs!(HuMG3MMrPtcWfB z5-Cju13SQS>>IVLs^J}(!?G%h^yVviGnz64I0CUQ6sj-dt(3dR`Zz+yvPG@#vKq=P zm3b(XTDQN@XTAT{V^8L}{1#b_p4}rg;0Ss#G*(*P z>|x=zPF4LZy{fs&fD}h~K0P1h8Og^i&1pw%Cut+i5r(#q$tPM=uChPUyrI~e4rf0u zBTeX4eW{?lS+7IIYL$^(Cx*12l+PTIqses~W2Xe&n1#R6;u1HEC!`jqAN4)D#^x?x z%ZD^C6~3=S`?53n3k8?jO38K01^8|$nda$a9L**OWiK~Qgd#|5np>KtC@7FX*}~4x3Sb6NfY4e%$Xp2_W7z;8h<8qcFP>rQUK9X zG(NMBzH12{A9_vEWA$heMWXhm@ye%$1S5<|OLxY^0pBpBLOuTNZNoTLE^lOTdhM2 z@RY)F>k%HHdNPNEn(6gJbI%>sUPem=^?i}(1mdEXdM>;nGdp~lHLk8LZqe4xu(}ISwBo3Qbtv%T*%~41M)EahEwbDkPUMU*DG48(vvqy za8p*fcC445S+@GUDr>x1rcP?ttoK2Mtbcm{E-OI8@gVb1?;YbCnPaAgvT7>(J6%DSe>#C2fH3^s-Zs_G+B} z49&>`eKolbbB2oyMA}qZN!p}7&k)Sxi)?2E^h5Ix_1ihP6!U}1tEo!Y2L0Li&dKCG z^$KYAthL_Lp)2Dg-lli@7pRsn$53ES^`p!IEvJm|fsB>m#F~6~=cB$sXyyXmA*-OY zpr)QOU*pLsRA!|)UQOwRqKE39y!4jPwuU@_9^tZ=lu@8LE$Jm0DVpDqu_8GJxPoI* zq{caD%_+#32}eo7>v{vdrs+!k5oY$7-kBV2-iaR_je?lPObTt?LilN^yNoq+9?J?V zT%pV^bM%(dA~G}ddqf&2{p001(XuAc*7G@Q(4zLe!XXCl(ZqMpxG+x&f2>z2**(jy z?_{&R2c!JB11%U(uyWM9?2J$R)HN1Xz6{aExb5_yQM$&rj%SxY0~i$oS9R~apl z=uCwVh*TO?xi4tB*+_-;b22xC=8KM0=OBDpQ-3b;W{Fr00XCGotN~Z^!;f8whqO z623(^=t#AP7rjF^{gj8^LG;YU%o{!9M8hm{R+&ZeMy*8<>4%_AbbJv{OUsKK{|wq& z#+&3L-}Iinf;$5lwZHMkX8sZg4{ah(MB5>y5yX?UWvstcffUkbQocaUvFqBNRbTgS zUeE}XR@8J}>okOt%3fO}3Q|Lnx5;|~y<_T9W!B4R_A122e3dGI0+SggEhn@w6q6{c zy7Zj%o6P4Tkc7J5w2n~LFqs+V{#fr6;_C4%qG^&ng6u|RR(X*#iF8jS;K93Etq05F zU3*knv`$!R9m>1(WE2FKS@UFim#ul{z(^fHN?l@2MTEy{EI&cA1T;cY?_eFBZ^$xVlrw*vJb`MdoqSb!VQaxjxq7P+3xs9-6K=9+@vBel}I9Kp(H-B@r7X}&{7 zhO7`@F?#iw7u}nT^#C2wBitO_l1|eZxyq>5WBOPlF$U_Q=d9kZ#;S2CGs@h-+Um7i zjq@kFS*I+6B&}!O4>mF26Vc@Uy6jK;qEis^D+lQpAXMdo~r8D5bvwY zqQ_SKyu4~W%QG_X^xj2N48hULI1xG|_k#DSx>O4oz4EPo*@gCmuA(wq8{4Dlk$gPQ z_ipt0<9SlAWwQ6x$g|V@`6igDxzJaspN#c}{VkF#vppKirLkvD zYP5&VU3^3O-=*Gs4gVgQtwO71)(Hkd)})3jhw$Qh^)dIJ^N&STxZjJ`6U>0@B1}1s za9uK9E`*ZFj52p>l1jIoo{PfKmZ-96sv+Y}R@lZyh8|1D&Y^4A9Hf`(>o@9`K(tQ{ zWwg3wWj`%>NE>PGNW*@Yc|M*x>NQx8d{cU^a|zwAHO#^Or`OZtT_@Wf$D7)PZB4UH zgjULk8lq~g_s>H2r7t!06mCJ=6!a%Xb2*xa5UECB71cXp>0#M_3+6<)oc4|Oi0~oO z#=%mm(;FStCdZ(A#N5S)av1f~2v-u|2js5s1~O}c`3lYBNR5SW3f9Yb{Ogc#3MSel zz{kjJ(0Z1Jy>G6Y<{jBV>$TRzM1{(jWS#}nqV7;9Q&uFhjnKQYmzT9LK+791VQ+FV zB_VppFTGixpA4nEk|G?fI-Wg2pO76%hmAXTizv$$8}0R&6Kx_g!N)v;H*`gB5%Tb;YEc_{xZ63@`}Iov9!_Y~5TdMA8Z zqtx+u*UHAY5btrU`90>J*W=+k_jkLw>JG0a~!-#wIjI5I4@(L)zi{loQS9oU|#v;B9FD|Swx|}(wuy}gO z1?5KEgz*bXy<8)>H=&}ih_AQuRXuCOou5^dTV5{ryN?||!k=Lm+emMDdF~8}&YGB8 zR+wANYvL04>d)aUG96x=Ut+|S56r75oadcv#PuComRnj-m`BPN{Tam#7?(GzB8$=+ zUGAYo<4W>o8F5X=Ehx?#J#8ilSC1UW-Pt1wr%fF{VvrFxgkRh-;^y$hU&L0Ui@aGC zWm51s`6`t*;(BqdC@Ue>cwk6L*=+817@1p9V8m@6Q&w19;VnY}GD+T9T2fMEbZIZ| zk!*~(6+?=0E5`A*PsUYDr})J@yEUt*uyk74bR+KUaTWercIh*&z*|%_aLjNcZm^^q zQ7CVoH_}@?mq(UK35t15+^fT9&(Qa#lcT?^$>R&Wv!w-#r7F7ock-3&iEKG|eue+l z){(iTg+^R;c42N&$qepY!#({#m*Lq(#B{Mq;rVKG={>HXNE)ci<72%u$ja!FK^=z| zd+GDZ`uS5~UuFAyd++@2$oZ&i59TkMWibFU~87 z$Z0;_JKx_V5v`2q@gs7ld5fae-$dQc+jTqJo2rJ2D2n#ip;cWIpE!zHpF7tweXd3I zl%=<|zwNYo?RoqyMiURBssEh@YcVF!U$M>g4{2$fz=TvSNms2#SFNS4TI6EGtlJ4@ z-P((D&mrF8XE#)oc`eiV|Li>s)zHec95`y+@W%SSC1Xj^UTNfz`s@oD08Ix%Rf~c< zK03dAP)X7B*!=S06}d%)dB#zyVhgFtcz;!zHSt#^@=YUl;M|ImafKIpW6fGc>khX0 zyNCvdUN1P#O2wL$3R|I;szR1gxn*S~7X;VK2-`oglbFPlSTs08sOfm2JuT%A151r4 zUB}D_HRH{ZINa>56GKaWwAuJ4##V42#E#FMrlw?s5hZ;a9a7rnql?et*g{yNiPXR~&d zToBS>$4P=(jVLVkmJeWgfvlD{X`dj3Id@u-n(y9n%d_{)dv<*>s~c>AOpXd~UWIoq z%Ua{j1y2(*UN1x~^<{8g*@%)Ey84>bM2?T})0$kfhdb7d+*YJ7WGWW%zhp+BA0iY1 zEX6F?NIYzYzqy-9a|gx~r!vR_V))y7OWl;26H%|$(Saw8=Hv2UHHrp7`D2=w zmrwMTRTSps76nQYX&5cWkIS9s)r)xZz*k+#0zHbghxWi4r+v1DbBw2aLyEV7i$wM-Z{$kN|Z4qy1}`q^H~h{2=I30(@O zhAxF0qx?gy8HBi^ct~!Z_xJ}}c#?OV11?Hfs+eZ7y2-c1@M~b3QaZDIRz*pvUIJss z6_i{s41TZKU$z)V#Ht|^>mM>Z%;_0%Qr!S;?`PC4c_yQ789E}g{r-*h;@hLH7spsA znyKY{a7C`4$~g71=dVS?7;~0&sH;TaiNCnyA!I@p>EW~4YcyAXUHRU*^YxtBqf6|c zsu3=;#Dy)#6y{aTE%Oe@&aKF8{$vM5UJ5H_=a$~j_dz4&uY4T%e-poONrZC=reC;= zS>K=IdO!{Dn?Z6Rb5atM`#YC;X6)-bpjH5Ni9 zA%{>&s3z19Y7K+`My-XANys5o5~>L`gjyrhpqPe*Apdd*m4s?S4WZV^v={^nA(N0p zs3cSqY6!Ku+9b-%%p~LxDhbtu8bYmZk{k=yOhOK!l2A>kA=K*TsI)aqugv2e{KI)Ebr4 zztXS}q~ zR1<0lwQ2}e)>^n`5^@NYgla+!q1LFO{xyb$kV(iPR1&HQ@~>78EsKR~CLxDVNvI~& z5Nh?X%d~LKB;*h(3Dy6vy{q|+>#E|?F zV`k!n(zNre_wIe?oZq?Up8N6cycwU1a~J2Hbjh_Q(vvvXaNfeXgL4<>o^;n+O{6Dr zuHn3ea|h=x&OPbMJ58h~ajxOKg>whzF3vsa=DSU#CvmRfyoGaTS%3_}S-{fhC9yrK)j$3iAh)Pg#=^rN-Rgn5YXoF z2x;mH&>fc(yTQoiNJmf;VQ__MTotX)xbKj=_Tg*wvLvJVI)VI8`{+LEGwwS!k!mxI z+NS&Pbo=bAJrM`}GNe&=ipM+O+!vHWXt&+>ndn7ju zQ`Xi2u0sn_S)J;OYvVEnjL|1v37^?SFZ#_tCKIG#O4^5?cg0I^ zra-KPVttAb@U)yyGbWw)hSbL@m*z;d(@v4m~p>=2BiSe`|xLl4D7loZF9#+A-i2j8yo7uN1w z_}AmR@TPo!^pSo?R`o9Y??>Xh@V_Fza-Obq_;=ywac}R!-@SkQE`0nh9B;k%c5veD z@7`W^3;kpKE*$TYGrUXA@GcqN_&mJ}cT*F30**ka$^;RSmur=<(iOw9LUP#(tYApa zCQ?Z&#F@+(hY08aAl1)L6OxyMZmU7y5np9PG7!Y_261a7kSYse&5H4Bq(KD{CV{v$ zQdL3s2&S+`8lgT|kG^gmkS3@AIUi6q9s?SPgw)qjUWpaOu=pKeT;HL>M=8hmoe?nt zG0%-w&Zil}-N33dq7Mq6Wk&IJ(h)}UTLKx`Hjf&$oN?dTPaoaqyn~{wjYe%Blc)64 zhS^Ww!PFa^Fj{>GK!3@?ZnZuoQh5?d-Y$mK-)1>%Q;P9@ z$D8HoRu4;)zT+?nU4=CfmbGcbr1X0LV~v{BHP$ETQ&JsVwO+|Mbr??A$-%8idt1l9P#>@3$Lsj$}q?i>P-5XR=ng4ha44fdvWR^>cgAUchDT(_-iAX3%M|^SP@fp& zm%GX{n?$Lv9<20+YAuCI3}c4sD{1X3w_Pg>sR*UJdWbdSNF&z#gA`n8xa7>3f@+;@*N{3&|K8<@@%YHC5 zUdxWxvg5Vvcr814Ei0eJN0{Sywy{|cH#+H2Lad58)p3FpBUoPNVdBt1w?wBm9XXaV zIWZPJPzZ(tB%vy=_^dGjeIy!Ex zBu4X{JJY`2L>PF�a`sh~+!)bZRKy=~W6uztVeqT2l#Au8~>4tdUvYt7&1A)3y5~ zH2nPL4_|w$+wPy~x88aQLC`k_22`$$(OMQkdT=!FZ1x;>WYDPT^A&NC5i^<$Bgw|R z)yycoLgVQDGvtt7_fqSsxcHBg9FX>;y0~L5J{Cf`&O^4}LO}lx_I98!&C$;>X7Zt+ zR=qsCs$q_MZ(G3Q-rE`wewUkd@?8s@{HG8&`4K1VUbPl=hVR6BQ5YZd z0+~-NVep;h9R)b1IW+KH?1G0RzP2@w=>IY6e^?E?Zk3MR@X*=r&0dFsB6Fig!)r10 zdl>dd(jv4^hRETw!d`7}X+YyO83h*5xHt+Hj>G4eYq&olNO^0UV)<{jntj~#v8e*~ zR@v-qwP$nz6zK`iO|es6R;RpTPKnds0TS+C=VD#YZUjeY zX(Xnlm5eFf%;5Jj+xDcm$zR#1tbNtS)WTEn0(s2^YHvP+PmIm28=afj*roYQ^G$eU z{r&egl8K^jLv5BLNh4hS<%?3s4f$dDg4S`_>Ug+h(}9V_I}Rp2Y@$tee2{$v4$(M( z#S)iZ9~K9>Wz6cQ&1yFsY&nA$T0b{*nd{ys+b>S;)#llq$UcN>LGQ`4+tBNB}J#+-`N&7AJp z!*RP`fQ83SFCV5C5C6b}gU*R7Kij|z3(7>6;TxT-hDa1&LW&)P?f51#;Nq}BIJMbZ z*WvepObRv;mkd7^j!iKehTRNl$qjFv_D)^B8g~$woF7`oK>+aZrM*M2Z%8a`E)=Gd zohjC0>#M7s>+OD>uS?U|TnGE*v^HxSz%i{cCoH~7Z(P&{$g+d0P=g^%n=G}r=l#vA z?e05u?BjziTc&4)LAydV4z6!s=yg|6^Ea^5!_>uIf4i2=P|J0@7(0!J@=BC}#=X>T zZ8R40e5T@Af=xjBjiY%klf~>`q6ueKE#QBQ{4dI;tLDtGQ>rzB)e9GMtK1GNFYoc*jp+Za6~n?I@fM=HaBT^tf0HT z5EMIhQ2cNS6uzNNDx&_{g=a&}Ca}3f3%b5u@Cpb^7qnwQe(3$qSX>w&Q&@LNi@I*6SD0$)0Jja*s3qO*oE)-q6a3WMOZLHMn zv)eyv_pv!w5I!91Zai_yGSJ;SpV+;Za_o$>TiLcVCGdJ^k}#;2#dzhGvt} z>Fn274oqa*wPnz+VE@S<;CeQ@gxopo;&=h~=Wu-qc{+YK_0Ru^?Gw;UhorQUpo1)< zn)&0;Ot_5QA!#4WZgvgYWPjdsxTC#Zv+TDlvzRSsi`i+M%dmkgdK}s&Kl!TEWNY7qon*l^>~)IIrF@8;QI2*jZDq7;=yjz1>>9J+3HAl(F5Y6i;(R>o9tekTA0C?RPR(KUwdD7TJt`_^%CFPuHt6l88-9^+ih0G d*37aexF<*ryQmlKit5|qz|`NUt9;_ee*r4vaUlQz literal 0 HcmV?d00001 diff --git a/Signaux_complexes_GL.res b/Signaux_complexes_GL.res new file mode 100644 index 0000000000000000000000000000000000000000..94072b54946a38eff3da0eaa685dfedfff719403 GIT binary patch literal 3008 zcmcJRPiqrF7>9qU0Y!?m;7Knbh=>Pio!(U%3k9`eO|PYBrxx3^)JX7Tj(&x?^&lc1 z`~o86EIE0$;K94S3$D*QlT9|M8jCvd*`0m={$_SkBS{s=vINti@%mKmKS4|>`lhBP z%X!cxCKb32B@xVM_r1{=ZRyg+$*kQ@H?B<8>2%cj)Y0LGSLz}pfCmRzH&Yh^cyK_F zvVa`|cyK_XGLIbscyK^5Wez(8@Zf+3>IxfpaFAtP%6BQ%B`x8&BZPnWAb*uz=H#tq6a$!@ZbO;xUfS24-R-h z4|WLP!2tp2!43gDI3Ni<*ug#?98d^7sDl6=98erR*dc%i2Q)+vb_n3X0U}7j4gowk zV1gd(5Ws^2oan(Gm0;)NfCTigQxL#|1B##rI|T6HfWqj(4gowkpc#6wLjVsB5I`yH z5Ws^2F6hA?cLh6l``|ze<;zCyfr4d>XwR^BwV9Ord6q$%UBD$VbZ0pA>yR_0Pu9_ot`4zm(jw!~WUh`3EX&W)+X* z_uAyQF*BNDrSmX{22)g}PYKJ8 zwzaD@;-9hVHJ;Y{O)kfnyk-s06FrE%cImlEZlfPN!|%LOzyAucdqfXnW_5+`iL3qo zrn4Di8}!~9QE)N#zlDDzdQI&vI&HNZdPHU#N#`K$J`rnrNZvO0Jv~NAK2q#buZHcK z_0894PlFvudvurB9jZNL?adK|VlQpo!!e_)FRtCr+qt-|wD;D{_8?bi{~OzRG2OYU Y!P}HB#FLO#*dS|*$l|-0EPpBg0P)8+=l}o! literal 0 HcmV?d00001 diff --git a/UnitDebug.dcu b/UnitDebug.dcu new file mode 100644 index 0000000000000000000000000000000000000000..3ca4aa80409a2ae654c9016f202c9fcff6c32cf8 GIT binary patch literal 6336 zcmeHL`*R${5uO>HPhmeYbn; z?)jBC2y7(?MLf)#!h}a2KnO_)P{g=W4t9WqN_Z4SQjmwCibR0p7@{8(lAv_Y-ktU= z^B?5wo!RcMr+cQmr)O4wA!OmfNElsKep22&}ty0Ac_5iv}g< z3?y{Z`@+)R>124IOWh<=%fID33+!%@w%=3U>`s;rtj>C#ZGGwe7ljdyOZn<2o_pIU zjr#*)i{IUc0FHR&@vcUL$8$q!wtr=&9*j+}k%gE((Q|B+qV07l!hu4ku_5pPSGhShFco@1xnw4uIe zR0iR8N2s3YRUI|$W)Q8Jjb3D0y1i|!YUwF)HOeeLiHxN?2vrB64v{o1(d*b5;drKS zJ(M`JSi*&g?Fd@PqEM_z$o6NsZIg6#+utsA`Ao-&2y^$E@U8p5Xrb)vIV zw(6Odu?xZSAlPNAy3nsdevz|!Y|l)Z8jP~7;aMtsRnzkPm0X8lRZ!*ntZ;U8TApx{ zswVazUgX6-q3Zn}gkl7tGlD}QZ6H3dlGSF1*=_6M`dOn3A~zsZ(Dic|y_AvcSRz;6*NascG0noW6r zc00dAyl9=^+BLS8b>Ez2IFATDx4qs%k)kE{582xwVruG72o>ehMXKes51A?bLb2n| zh@L&rufZNoflnccaw_9(`exY6GnxEMefTV+?&P9b&-PU$EOk>#==)LjQ`8n@JFN|- z*!C=lLRrn%iF_>vR|Mzcx=>37?3>bD6t^O{_ykZUi?|J;Gm0P? zS=cv1_eJhNk;)Pj2MW`%vvc`2sym8}38FGe1SJ*LI-@+tznbs3Ito zOGC){hY&kGh!yI|I>$6j>t`rXv=$Wb%WPu12fNjM3Pq|<(9t2bnwmgCvE6$bC5on5 z*vP9@ZHwX9SxbKzg^Ik5S(P*ODuP98=(M)xwsgq{fSnSw-zPFyqc{RZAp*0j(Uv<8 zq4MAuzkba3`8lg`SgT)AzWB|nK8t(JUpVqR9M$MdtA=n_A_m1|2FvAT3j#}mK)w`r z*xHtU(-Z9})pfs$Vz3u;<6(~Z9P62dpj9l5>xyl{n4HaC1foG@c+Re$r6^xx2N8i2 zBWK({xAS%Mwpq#sAetYJz>r0SAz-`RPT9^o$eytbE<)ko02emg`Hq?yGPS}X54Q}t zc2VG9HMi3l+k%ve`@!fFh6x36$Bj3BbQJ4N0lvrq-^o*CFG6q@7odJMDcaRkDzRM? z8O;7iQKEdHS2!*xL*;F9d;g$^Uj-A}pgJa0sKPYx&b7lG^vs!ynlT?!KI`Do1Q#0X z&cFW~q`HOcV)XMR1Xkpqi3N@^cf*BO_9X@e`+7dQ_sE|>05qe6XNH7<h0e81` zn>NEaeqhfdS0+R4L#p$~m#GO}_1W_sQ_gyD_)53#hI(*Vx_6pE9^4+f^^|PxZPym2zHv zc-K?Lf>ysytuZZd^$wIsmg1pr29ousSI_>lIVg~Nj2g;VFihWb1sF6NnV$A=j-=>)tDeBH*Zpn zT60%_QkI*I{8AucIokh}AR(=8o_`_sr&{&a=FeA?Wo7b?ELqn#bx(EGD0A_SEE#`o z``M!Inw1KRuShDSJ~ks7M;Ym`;m<|?njv+(c1fsTq>{;+sU_ilVd-$Giyp5H`z0~C zU_z^3eBy9Z=1|{ZE#J=5*NxTmrN$!^=^{zd|Qf@rtiP zp=PpjLMef}Q?lynDTT(9;Uil8nE}1{v6TO$f(uBm1G{!Oj;hy}oK*E6YD+*aS$;gH zoQh;6=#0ozH+TA1VoV`&*%GBzyN}feG6fTfM3+Q?|H=7;lbR3tnl9eLB1Dax$96vQ z$$>i35DCsH#@?RS5SHI@=fpxE&TA;cud>8e_@eY;VH(L{D`KHVk%qFF&#+k8l1M`& z=(QL>CokO;3$;ZW=AtGU@>qC%WVy@$8Qs{iPR5s)$!N=P#g1(R#-gA$8H3m{6Zo;< zeDgkx9UEa>>wq;X3t`Q}3#X^2ujy@t*VN+Ex}XdGLO`@qLVg7g{!V9vRF?Sf|8Hk| zfRj4#&=fp`6lKeQfJI3zT?lxPkwCtLfRRU6a3D%ZAY&rH2$7 zDrYv6H;W`4$Q$@u2>fQ}&FPYV(!2>&ra4mT#0GPvG$57Fr7OtHJ|kps?C9>plcU{} zqk~hUiT{kfd-)-s)%5Gp?y1qiNnkb|931*CXw#<~^-*R2Gw?bFqQmId2{b#NnA(3B z`U1frKMO=}o){aPlH<@@65ZdFSA{;4EGdB0Saf>t5rCTxUb1ncJ{leRArN3lN*#I+ z2=c*koGyV4GmZP95gvR$7y5SLc|u7F>wV7=3j8r4Ej&g4jGBax@gdq$__ z^7)to7^%_3@iF*6tUx+I)cRs02fxuVnmGDGViLnLE~h>tF*rF^Io%%_yB$|_qA{s? zIx#ujeKh<0iC`fW&I7&UBRF2l=hvUhigzz9Wbs6Q(_5pLPe{KV&H3#|Fel${V~MF7 z$jbTIE%5R@`emXxt;Z4*pwluO~;NAJohI zFCPBEDf?eRfugNaSi_S5jVC6g_Ix_ai32~M(YQVG@0i_?5x5u6hF5YTpL=^LD0#_3j0 zzsTtUPFHi08BW)7dNHRvIo;0b*Ezk5({FORiqji7y@%6#Ic??i zK2GoF^g&L)%V`g%U7SA5=>VsXa(XkTdpW(0(>pk|IE{1q4Ne<5UBPKHr^B3H$LYD8 z?&0)$PSrUOT(S4F1(Q~gAo<*RI|sT(3P=2`rV&%T`ha8 zjy=8-peQ>MVegEWgiW>zOjNVyYFTX$TUyQDuVBZ@*vHlEqcS!LFZbtP>ev*JRUlo# zj`-s%!Xs=2&W`=0f>G97!YhFS>kIs@3OZl1E4+^_p!--QO|UBH!FV*xLO?}I+07SR zFglmlaL!h-I#wnB)xz6lk!%U;0}ZvI238At71qcqL+3L6<1jA^Wq27|6DkK?t3nah z7+My(Ds(Sda0_Dx$lg#5Ar(saT1Kwtx30aI!Fk5OXN<&J7-OWOg@qWYY++$Wsvx5n zscr#(ks7$5F`~4v1&q|TfN8Q6b1zh1x3-0qGg7w^sb%#WT3C#cdK0OJWmXILge)6D zD&BBU3#(+Lp$)CA?8f$`k4x8Mzjjczmt(u-Yb7f78w9o&r?DkhV{2ux&FsL|*@dk) ziY*z(_MTg0dpoxG-YwgG*zUir5>f_^VYX3ri+-; C==0) and (i<=3) then NivDebug:=i + else EditNivDebug.text:='3'; + end + else EditNivDebug.text:='0'; + end; +end; + +end. diff --git a/UnitDebug.~dfm b/UnitDebug.~dfm new file mode 100644 index 0000000..35ad148 --- /dev/null +++ b/UnitDebug.~dfm @@ -0,0 +1,120 @@ +object FormDebug: TFormDebug + Left = 402 + Top = 33 + BorderStyle = bsSingle + Caption = 'FormDebug' + ClientHeight = 639 + ClientWidth = 759 + Color = clWhite + TransparentColorValue = clTeal + Font.Charset = DEFAULT_CHARSET + Font.Color = clWhite + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + OldCreateOrder = False + Position = poMainFormCenter + OnClose = FormClose + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 456 + Top = 52 + Width = 108 + Height = 13 + Caption = 'Niveau du Debug (0-3)' + Color = clWhite + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentColor = False + ParentFont = False + end + object Label2: TLabel + Left = 448 + Top = 12 + Width = 131 + Height = 18 + Caption = 'Fen'#234'tre de d'#233'bug' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [fsBold, fsItalic] + ParentFont = False + end + object Label3: TLabel + Left = 456 + Top = 84 + Width = 265 + Height = 209 + AutoSize = False + Caption = 'Label3' + Color = clGray + Font.Charset = ANSI_CHARSET + Font.Color = clWindow + Font.Height = -16 + Font.Name = 'Arial Narrow' + Font.Style = [] + ParentColor = False + ParentFont = False + WordWrap = True + end + object EditNivDebug: TEdit + Left = 576 + Top = 52 + Width = 73 + Height = 21 + Font.Charset = DEFAULT_CHARSET + Font.Color = clBlue + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + ParentFont = False + TabOrder = 0 + Text = 'EditNivDebug' + OnKeyPress = EditNivDebugKeyPress + end + object MemoEvtDet: TMemo + Left = 456 + Top = 308 + Width = 209 + Height = 281 + Color = clBlack + Font.Charset = DEFAULT_CHARSET + Font.Color = clYellow + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Lines.Strings = ( + 'Tableau des '#233'v'#232'nements d'#233'tecteurs') + ParentFont = False + TabOrder = 1 + end + object ButtonEcrLog: TButton + Left = 456 + Top = 596 + Width = 97 + Height = 25 + Caption = 'Ecrire le log' + TabOrder = 2 + OnClick = ButtonEcrLogClick + end + object RichEditDebug: TRichEdit + Left = 0 + Top = 0 + Width = 433 + Height = 633 + Color = clMaroon + Lines.Strings = ( + 'RichEditDebug') + TabOrder = 3 + end + object SaveDialog: TSaveDialog + Left = 616 + Top = 16 + end +end diff --git a/UnitDebug.~pas b/UnitDebug.~pas new file mode 100644 index 0000000..b5a63bb --- /dev/null +++ b/UnitDebug.~pas @@ -0,0 +1,91 @@ +unit UnitDebug; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls ,UnitPrinc, ComCtrls; + +type + TFormDebug = class(TForm) + EditNivDebug: TEdit; + Label1: TLabel; + MemoEvtDet: TMemo; + Label2: TLabel; + SaveDialog: TSaveDialog; + ButtonEcrLog: TButton; + Label3: TLabel; + RichEditDebug: TRichEdit; + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure FormCreate(Sender: TObject); + procedure ButtonEcrLogClick(Sender: TObject); + procedure EditNivDebugKeyPress(Sender: TObject; var Key: Char); + private + { Déclarations privées } + public + { Déclarations publiques } + end; + +var + FormDebug: TFormDebug; + +implementation + +{$R *.dfm} + +procedure TFormDebug.FormClose(Sender: TObject; var Action: TCloseAction); +begin + //Action := TCloseAction.caNone; + //DebugOuv:=False; + //NivDebug:=0; +end; + +procedure TFormDebug.FormCreate(Sender: TObject); +var s: string; +begin + EditNivDebug.Text:='0'; + s:='Cette fenêtre permet d''afficher des informations sur le '; + s:=s+'comportement du programme. Positionner le niveau de 1 à 3 pour'; + s:=s+' afficher des informations plus ou moins détaillées.'; + Label3.caption:=s; +end; + +procedure TFormDebug.ButtonEcrLogClick(Sender: TObject); +var s : string; + i : integer; + fte : textFile; +begin + s:=GetCurrentDir; + SaveDialog.InitialDir:=s; + if SaveDialog.Execute then + begin + s:=SaveDialog.FileName; + assignFile(fte,s); + rewrite(fte); + writeln(fte,s); + with RichEdit1 do + for i:=1 to Lines.Count do + begin + writeln(fte,Lines[i]); + end; + closefile(fte); + end; +end; + +procedure TFormDebug.EditNivDebugKeyPress(Sender: TObject; var Key: Char); + var i,e : integer; +begin + if ord(Key) = VK_RETURN then + begin + Key := #0; // prevent beeping + val(EditNivDebug.text,i,e); + if e=0 then + begin + if (i>=0) and (i<=3) then NivDebug:=i + else EditNivDebug.text:='3'; + end + else EditNivDebug.text:='0'; + end; +end; + +end. diff --git a/UnitPrinc.dcu b/UnitPrinc.dcu new file mode 100644 index 0000000000000000000000000000000000000000..804e9d7cd17d66c2028cff6432e22c9955ea14c4 GIT binary patch literal 129375 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 + SimplePanel = True + end + object MSComm1: TMSComm + Left = 1120 + Top = 8 + Width = 32 + Height = 32 + OnComm = MSComm1Comm + ControlData = { + 2143341208000000ED030000ED03000001568A64000006000000010000040000 + 00020000802500000000080000000000000000003F00000001000000} + end + object loco: TButton + Left = 976 + Top = 10 + Width = 75 + Height = 25 + Caption = 'loco' + TabOrder = 10 + OnClick = locoClick + end + object ButtonAffDebug: TButton + Left = 784 + Top = 10 + Width = 75 + Height = 25 + Caption = 'Affiche debug' + TabOrder = 11 + OnClick = ButtonAffDebugClick + end + object Timer1: TTimer + Interval = 100 + OnTimer = Timer1Timer + Left = 1072 + Top = 8 + end + object ClientSocketLenz: TClientSocket + Active = False + ClientType = ctNonBlocking + Port = 0 + OnConnect = ClientSocketLenzConnect + OnRead = ClientSocketLenzRead + OnError = ClientSocketLenzError + Left = 408 + end + object MainMenu1: TMainMenu + Left = 216 + Top = 8 + object Afficher1: TMenuItem + Caption = 'Afficher' + object Etatdesdtecteurs1: TMenuItem + Caption = 'Etat des d'#233'tecteurs' + OnClick = AffEtatDetecteurs + end + object Etatdesaiguillages1: TMenuItem + Caption = 'Etat des aiguillages' + OnClick = Etatdesaiguillages1Click + end + object N3: TMenuItem + Caption = '-' + end + object Codificationdesaiguillages1: TMenuItem + Caption = 'Codification des aiguillages' + OnClick = Codificationdesaiguillages1Click + end + end + object Interface1: TMenuItem + Caption = 'Interface' + object MenuConnecterUSB: TMenuItem + Caption = 'Connecter USB' + Hint = 'Connecter l'#39'interface en USB' + OnClick = MenuConnecterUSBClick + end + object DeconnecterUSB: TMenuItem + Caption = 'D'#233'connecter USB' + Hint = 'D'#233'connecter l'#39'interface USB' + OnClick = DeconnecterUSBClick + end + object N2: TMenuItem + Caption = '-' + end + object MenuConnecterEthernet: TMenuItem + Caption = 'Connecter Ethernet' + Hint = 'Connecter l'#39'interface par Ethernet' + OnClick = MenuConnecterEthernetClick + end + object MenuDeconnecterEthernet: TMenuItem + Caption = 'D'#233'connecter Ethernet' + Hint = 'D'#233'connecter l'#39'interface par Ethernet' + OnClick = MenuDeconnecterEthernetClick + end + object N4: TMenuItem + Caption = '-' + end + object ConnecterCDMrail: TMenuItem + Caption = 'Connecter CDM rail' + OnClick = ConnecterCDMrailClick + end + object DeconnecterCDMRail: TMenuItem + Caption = 'D'#233'connecter CDM rail' + OnClick = DeconnecterCDMRailClick + end + end + end + object ClientSocketCDM: TClientSocket + Active = False + ClientType = ctNonBlocking + Port = 0 + OnConnect = ClientSocketCDMConnect + OnDisconnect = ClientSocketCDMDisconnect + OnRead = ClientSocketCDMRead + OnError = ClientSocketCDMError + Left = 448 + end +end diff --git a/UnitPrinc.pas b/UnitPrinc.pas new file mode 100644 index 0000000..ed2e300 --- /dev/null +++ b/UnitPrinc.pas @@ -0,0 +1,5520 @@ +Unit UnitPrinc; +(******************************************** + programme direct signaux complexes + delphi 7 + activeX Tmscomm + clientSocket + ******************************************** + note sur le pilotage des accessoires: + raquette octet sortie + + 2 = aiguillage droit + - 1 = aiguillage dévié +*) + + +interface + + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, OleCtrls, ExtCtrls, jpeg, ComCtrls, + ImgList, ScktComp, StrUtils, Menus, ActnList, MSCommLib_TLB ; + +type + TFormPrinc = class(TForm) + BoutVersion: TButton; + ListBox1: TListBox; + Timer1: TTimer; + Label1: TLabel; + BoutonRaf: TButton; + ScrollBox1: TScrollBox; + ClientSocketLenz: TClientSocket; + GroupBox1: TGroupBox; + EditAdresse: TEdit; + Label2: TLabel; + Editval: TEdit; + Label3: TLabel; + ButtonCommande: TButton; + ButtonTest: TButton; + ButtonInfo: TButton; + GroupBox2: TGroupBox; + EditDetecteur1: TEdit; + BoutCalcZone: TButton; + LabelDetSP: TLabel; + MainMenu1: TMainMenu; + Interface1: TMenuItem; + MenuConnecterUSB: TMenuItem; + DeconnecterUSB: TMenuItem; + N2: TMenuItem; + MenuConnecterEthernet: TMenuItem; + MenuDeconnecterEthernet: TMenuItem; + StatusBar1: TStatusBar; + Label4: TLabel; + MSComm1: TMSComm; + LabelEtat: TLabel; + loco: TButton; + Afficher1: TMenuItem; + Etatdesdtecteurs1: TMenuItem; + Etatdesaiguillages1: TMenuItem; + N3: TMenuItem; + Codificationdesaiguillages1: TMenuItem; + EditDetecteur2: TEdit; + ClientSocketCDM: TClientSocket; + Image9feux: TImage; + Image7feux: TImage; + Image5feux: TImage; + Image4feux: TImage; + Image3feux: TImage; + Image2feux: TImage; + ButtonAffDebug: TButton; + N4: TMenuItem; + ConnecterCDMrail: TMenuItem; + DeconnecterCDMRail: TMenuItem; + procedure FormCreate(Sender: TObject); + procedure MSComm1Comm(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure Timer1Timer(Sender: TObject); + procedure BoutVersionClick(Sender: TObject); + procedure ButtonCommandeClick(Sender: TObject); + procedure EditvalEnter(Sender: TObject); + procedure ListBox1DrawItem(Control: TWinControl; Index: Integer; + Rect: TRect; State: TOwnerDrawState); + procedure BoutonRafClick(Sender: TObject); + procedure ClientSocketLenzError(Sender: TObject; Socket: TCustomWinSocket; + ErrorEvent: TErrorEvent; var ErrorCode: Integer); + procedure ClientSocketLenzRead(Sender: TObject; Socket: TCustomWinSocket); + procedure ButtonTestClick(Sender: TObject); + procedure ButtonInfoClick(Sender: TObject); + procedure BoutCalcZoneClick(Sender: TObject); + procedure MenuConnecterUSBClick(Sender: TObject); + procedure DeconnecterUSBClick(Sender: TObject); + procedure MenuConnecterEthernetClick(Sender: TObject); + procedure MenuDeconnecterEthernetClick(Sender: TObject); + procedure locoClick(Sender: TObject); + procedure AffEtatDetecteurs(Sender: TObject); + procedure Etatdesaiguillages1Click(Sender: TObject); + procedure Codificationdesaiguillages1Click(Sender: TObject); + procedure ClientSocketCDMError(Sender: TObject; + Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; + var ErrorCode: Integer); + procedure ClientSocketLenzConnect(Sender: TObject; + Socket: TCustomWinSocket); + procedure ClientSocketCDMConnect(Sender: TObject; + Socket: TCustomWinSocket); + procedure ClientSocketCDMRead(Sender: TObject; + Socket: TCustomWinSocket); + procedure ButtonAffDebugClick(Sender: TObject); + procedure ConnecterCDMrailClick(Sender: TObject); + procedure DeconnecterCDMRailClick(Sender: TObject); + procedure ClientSocketCDMDisconnect(Sender: TObject; + Socket: TCustomWinSocket); + + private + { Déclarations privées } + procedure DoHint(Sender : Tobject); + public + { Déclarations publiques } + procedure proc_checkBoxFB(Sender : Tobject); + end; + + +// définition des adresses normalisées du décodeur de leds de digitalBahn +// l'ordre des adresses est à respecter dans la programation des signaux. +// L'oeilleton est cablé sur la sortie 4, il est géré directement par le décodeur. **/ +// code des aspects des signaux +const +AF='Client TCP-IP CDM Rail ou USB - système LENZ - Version 1.0'; +carre =0 ; carre_F=1; +semaphore =1 ; semaphore_F=2; +semaphore_cli =2 ; semaphore_cli_F=4; +vert =3 ; vert_F=8; +vert_cli =4 ; vert_cli_F=16; +violet =5 ; violet_F=32; +blanc =6 ; blanc_F=64; +blanc_cli =7 ; blanc_cli_F=128; +jaune =8 ; jaune_F=256; +jaune_cli =9 ; jaune_cli_F=512; +ral_30 =10; ral_30_F=1024; +ral_60 =11; ral_60_F=2048; +rappel_30 =12; rappel_30_F=4096; +rappel_60 =13; rappel_60_F=8192; +Disque_D =14; // pour décodeur LDT +ral_60_jaune_cli =15;ral_60_jaune_cli_F=16384; // pour décodeur LDT +aspect8 =16 ; + +tempoFeu = 100; +MaxAcc = 2048; +LargImg=50;HtImg=91; +const_droit=2;const_devieD=2;const_devieG=3; // aiguillages en position +MaxElParcours=40; + +EtatSign : array[0..13] of string[20] =('carré','sémaphore','sémaphore cli','vert','vert cli','violet', + 'blanc','blanc cli','jaune','jaune cli','ral 30','ral 60','rappel 30','rappel 60'); + +type TBranche = record + BType : integer ; // 1= détecteur 2= aiguillage 3=bis 4=Buttoir + Adresse : integer ; // adresse du détecteur ou de l'aiguillage + end; + + Taiguillage = record + modele : integer; // 0=n'existe pas 1=aiguillage 2=TJD 3=TJS 4=aiguillage triple + position, // position actuelle : 1=dévié 2=droit + Adrtriple, + temps, // temps de pilotage (durée de l'impulsion en x 100 ms) + inversion : integer; // pilotage inversé 0=normal 1=inversé + 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 + ADroitB : char ; // id de branche pour TJD + ADroitBis : integer ; // 0=pas connecté à aiguillage dont l'adresse est bis =1 connecté à un aig bis + + ADevie : integer ; // (identifiant extérieur) adresse de l'élément connecté en position déviée + ADevieB : char; // caractère (D ou S)si aiguillage de l'élément connecté en position déviée + AdevieBis : integer ; // 0=pas connecté à aiguillage dont l'adresse est bis =1 connecté à un aig bis + + APointe : integer; // adresse de l'élément connecté en position droite ; pour les TJD : adresse de l'autre tjd + APointeB : char; + ApointeBis : integer; // 0=pas connecté à aiguillage dont l'adresse est bis =1 connecté à un aig bis + + tjsint : integer; + tjsintb : char ; + + // éléments connectés sur la branche déviée 2 (cas d'un aiguillage triple) + Adevie2 : integer; + Adevie2B : char ; + Adevie2Bis : integer; + + end; + +Taccessoire = (aig,feu); +TMA = (valide,devalide); +//Tparcours = record +// adresse : integer ; +// BType : char; +// end; + +var ancien_tablo_signalCplx,EtatsignalCplx : array[0..MaxAcc] of word; + AvecInitAiguillages,tempsCli,combine,NbreFeux,pasreponse,AdrDevie,precedent , + NombreImages,signalCpx,branche_trouve,Indexbranche_trouve,Actuel,Signal_suivant, + Nbre_recu_cdm,NivDebug,Tempo_chgt_feux : integer; + dem_calcul_zone,Hors_tension2,traceSign,TraceZone,Ferme,ParUSB,parSocket,ackCdm, + NackCDM : boolean; + clignotant,test_leb,nack,Maj_feux_cours,avecMSCom : boolean; + N_event_det : integer; // index du dernier évènement (de 1 à 20) + event_det : array[1..20] of integer; + branche : array [1..100] of string; + parcours : array[1..MaxElParcours] of TBranche ; // parcours des locos en fonction des détecteurs + +const + ClBleuClair=$FF7070 ; + Cyan=$FFA0A0; + clviolet=$FF00FF; + GrisF=$333333; + clOrange=$0077FF; + Feu_X=50;Feu_Y=91; +var + FormPrinc: TFormPrinc; + ack,portCommOuvert,trace,AffMem,AfficheDet,Bis,CDM_connecte,parSocketCDM, + DebugOuv : boolean; + tablo : array of byte; + Enregistrement,AdresseIP,chaine_Envoi,chaine_recue,AdresseIPCDM,recuCDM,Id_CDM : string; + maxaiguillage,detecteur_chgt,Temps,TpsRecuCom,NumPort,Tempo_init,Suivant, + timerSimule,NbreImagePligne,Port,NbreBranches,Index2_det,branche_det,Index_det,portCDM : 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 + detect_Simule : array[0..200] of integer; + index_simule,NDetecteurs : integer; + couleur : Tcolor; + fichier : text; + recuCDML : array of string; + + + // l'indice du tableau aiguillage est son adresse + aiguillage : array[0..MaxAcc] of Taiguillage; + aiguillageB : array[0..MaxAcc] of Taiguillage; + + + // dessin des feux + feux : array[1..MaxAcc] of record + adresse, aspect : integer; // adresse du feu, aspect codé en binaire + Img : TImage; // Pointeur sur structure TImage du feu + Lbl : TLabel; // pointeur sur structure Tlabel du feu + check : TCheckBox; // pointeur sur structure Checkbox avec feu blanc + FeuBlanc : boolean ; // avec checkbox ou pas + decodeur : integer; // type du décodeur + Adr_det1 : integer; // adresse du détecteur1 sur lequel il est implanté + Adr_det2 : integer; // adresse du détecteur1 sur lequel il est implanté (si un signal est pour plusieurs voies) + Adr_det3 : integer; // adresse du détecteur1 sur lequel il est implanté (si un signal est pour plusieurs voies) + Adr_det4 : integer; // adresse du détecteur1 sur lequel il est implanté (si un signal est pour plusieurs voies) + Adr_el_suiv1 : integer; // adresse de l'élément suivant + Adr_el_suiv2 : integer; // adresse de l'élément suivant (si un signal est pour plusieurs voies) + Adr_el_suiv3 : integer; // adresse de l'élément suivant (si un signal est pour plusieurs voies) + Adr_el_suiv4 : integer; // adresse de l'élément suivant (si un signal est pour plusieurs voies) + Btype_suiv1 : integer ; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri 5=bis + Btype_suiv2 : integer ; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri 5=bis + Btype_suiv3 : integer ; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri 5=bis + Btype_suiv4 : integer ; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri 5=bis + VerrouCarre : boolean ; // si vrai, le feu se verrouille au carré si pas de train avant le signal + EtatSignal : word ; // comme EtatSignalCplx + end; + Fimage : Timage; + + BrancheN : array[1..100,1..200] of TBranche; + +{$R *.dfm} + +implementation + +uses UnitDebug; + +procedure menu_interface(MA : TMA); +var val : boolean; +begin + val:=MA=valide; + with formprinc do + begin + MenuConnecterUSB.enabled:=val; + DeConnecterUSB.enabled:=val; + MenuConnecterEthernet.enabled:=val; + MenuDeConnecterEthernet.enabled:=val; + end; +end; + +procedure Tformprinc.DoHint(Sender : Tobject); +begin + StatusBar1.Simpletext:=Application.Hint; +end; + +// conversion du motif de bits de la configuration du signal complexe en deux mots: +// premier mot : (retour de la fonction=(premiers bits)code de la signalisation +// deuxième mot: variable Combine = code de la signalisation combinée +// Exemple code_to_aspect(10001000000000) renvoie jaune et Combine=rappel_30 +function code_to_aspect(codebin : word) : word; +var i,mot,premierbit : word; +begin + mot:=codebin; + i:=0;premierbit:=0;Combine:=0; + + while (i<15) do + begin + if (mot and 1)=1 then // si bit 0 du mot est à 1 + begin + if (premierbit=0) then premierbit:=i else Combine:=i; + end; + mot:=mot shr 1; //décaler à droite + inc(i); + end; + code_to_aspect:=premierbit; +end; + +// dessine un cercle plein dans le feu +procedure cercle(ACanvas : Tcanvas;x,y,rayon : integer;couleur : Tcolor); +begin + with Acanvas do + begin + brush.Color:=couleur; + Ellipse(x-rayon,y-rayon,x+rayon,y+rayon); + end; +end; + +// dessine les feux sur une cible à 2 feux +procedure dessine_feu2(Acanvas : Tcanvas;EtatSignal : word); +var code : integer; +begin + code:=code_to_aspect(Etatsignal); // et aspect + // extinctions + if not((code=blanc_cli) and clignotant) then cercle(ACanvas,13,11,6,GrisF); + cercle(ACanvas,13,23,6,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); +end; + +// dessine les feux sur une cible à 3 feux +procedure dessine_feu3(Acanvas : Tcanvas;EtatSignal : word); +var code : integer; +begin + code:=code_to_aspect(Etatsignal); // et aspect + // 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); + + // 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); +end; + +// dessine les feux sur une cible à 4 feux +procedure dessine_feu4(Acanvas : Tcanvas;EtatSignal : word); +var code : integer; +begin + code:=code_to_aspect(Etatsignal); // et aspect + + //extinctions + cercle(ACanvas,13,11,6,GrisF); + if not((code=semaphore_cli) and clignotant) then cercle(ACanvas,13,33,6,GrisF); + if not((code=vert_cli) and clignotant) then cercle(ACanvas,13,22,6,GrisF); + if not((code=jaune_cli) and clignotant) then cercle(ACanvas,13,44,6,GrisF); + + // allumages + if ((code=vert_cli) and (clignotant)) or (code=vert) then cercle(ACanvas,13,22,6,clGreen); + if ((code=jaune_cli) and (clignotant)) or (code=jaune) then cercle(Acanvas,13,44,6,clOrange); + if ((code=semaphore_cli) and (clignotant)) or (code=semaphore) then cercle(ACanvas,13,33,6,clRed); + if code=carre then + begin + cercle(ACanvas,13,33,6,clRed); + cercle(ACanvas,13,11,6,clRed); + end; +end; + +// dessine les feux sur une cible à 5 feux +procedure dessine_feu5(Acanvas : Tcanvas;EtatSignal : word); +var code : integer; +begin + code:=code_to_aspect(Etatsignal); // et aspect + // 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); + + //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=carre then + begin + cercle(ACanvas,13,44,6,clRed); + cercle(ACanvas,13,11,6,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); +end; + +// affiche un texte dans la fenêtre +procedure Affiche(s : string;lacouleur : TColor); +begin + couleur:=lacouleur; + with formprinc.ListBox1 do + begin + Items.addObject(s,pointer(lacouleur)); + TopIndex:= Items.Count - 1; + end; +end; + +procedure AfficheDebug(s : string;lacouleur : TColor); +begin + if DebugOuv then + FormDebug.MemoDebug.Lines.add(s); +end; + +// dessine les feux sur une cible à 7 feux +procedure dessine_feu7(Acanvas : Tcanvas;EtatSignal : word); +var code : integer; +begin + code:=code_to_aspect(Etatsignal); // et combine + // effacements + + if not((code=blanc_cli) and clignotant) then cercle(ACanvas,13,23,6,violet); + 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); + 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); + + // 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); + 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=carre then + begin + cercle(ACanvas,13,35,6,clRed); + cercle(ACanvas,13,55,6,clRed); + end; +end; + +// dessine les feux sur une cible à 9 feux +procedure dessine_feu9(Acanvas : Tcanvas;etatsignal : word); +var code : integer; +begin + code:=code_to_aspect(Etatsignal); // et aspect + // extinctions + if not((code=blanc_cli) and clignotant) then cercle(ACanvas,13,36,6,grisF); + if not((code=ral_60) and clignotant) or not((combine=ral_60) and clignotant) then + begin + cercle(ACanvas,13,24,6,grisF);cercle(ACanvas,37,24,6,grisF); + end; + if not((code=jaune_cli) and clignotant) then cercle(ACanvas,13,80,6,grisF); + if not((code=rappel_60) and clignotant) or not((combine=rappel_60) and clignotant) then + begin + cercle(ACanvas,37,12,6,grisF);cercle(ACanvas,37,37,6,grisF); + end; + cercle(ACanvas,13,47,6,grisF); // carré supérieur + if not((code=semaphore_cli) and clignotant) then cercle(ACanvas,13,69,6,grisF); + if not((code=vert_cli) and clignotant) then cercle(ACanvas,13,58,6,grisF); + + // allumages + if ((code=ral_60) and clignotant) or (code=ral_30) or + ((combine=ral_60) and clignotant) or (combine=ral_30) then + begin + cercle(ACanvas,13,24,6,clOrange);cercle(ACanvas,37,24,6,clOrange); + end; + + if ((code=rappel_60) and clignotant) or (code=rappel_30) or + ((combine=rappel_60) and clignotant) or (combine=rappel_30) then + begin + cercle(ACanvas,37,12,6,clOrange);cercle(ACanvas,37,37,6,clOrange); + end; + if ((code=jaune_cli) and clignotant) or (code=jaune) then cercle(Acanvas,13,80,6,clOrange); + if ((code=semaphore_cli) and clignotant) or (code=semaphore) then cercle(ACanvas,13,69,6,clRed); + if ((code=vert_cli) and clignotant) or (code=vert) then cercle(ACanvas,13,58,6,clGreen); + if ((code=blanc_cli) and clignotant) or (code=blanc) then cercle(ACanvas,13,36,6,clWhite); + + if code=carre then + begin + cercle(ACanvas,13,47,6,clRed); + cercle(ACanvas,13,69,6,clRed); + end; +end; + + +// renvoie l'index du feu dans le tableau feux[] en fonction de son adresse +//si pas de feu renvoie 0 +function Index_feu(adresse : integer) : integer; +var i : integer; + trouve : boolean; +begin +i:=1; + repeat + trouve:=feux[i].adresse=adresse; + if not(trouve) then inc(i); + until (trouve) or (i>=100); + 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); +var i : integer; +begin + i:=Index_feu(adresse); + if i<>0 then + case feux[i].aspect of + 2: dessine_feu2(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); + 3: dessine_feu3(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); + 4: dessine_feu4(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); + 5: dessine_feu5(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); + 7: dessine_feu7(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); + 9: dessine_feu9(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); + end; +end; + + +// créée une image dynamiquement pour un nouveau feu déclaré dans le fichier de config +procedure cree_image(rang : integer); +var TypeFeu : integer; + s : string; +const espY = 15; // espacement Y entre deux lignes de feux +begin + TypeFeu:=feux[rang].aspect; + Feux[rang].Img:=Timage.create(Formprinc.ScrollBox1); + with Feux[rang].Img do + begin + Parent:=Formprinc.ScrollBox1; // dire que l'image est dans la scrollBox1 + Top:=(HtImg+espY+20)*((rang-1) div NbreImagePLigne); // détermine les dimensions + Left:=10+ (LargImg+5)*((rang-1) mod (NbreImagePLigne)); + s:='Decodeur='+intToSTR(feux[rang].Decodeur)+' Adresse détecteur associé='+intToSTR(feux[rang].Adr_det1)+ + ' Adresse élement suivant='+intToSTR(feux[rang].Adr_el_suiv1); + if feux[rang].Btype_suiv1=2 then s:=s+' (aig)'; + if feux[rang].Btype_suiv1=5 then s:=s+' (aig bis)'; + + Hint:=s; + case TypeFeu of // charger le bit map depuis le fichier + 2 : picture.bitmap:=Formprinc.Image2feux.picture.Bitmap; + //picture.Bitmap.LoadFromFile('2feux.bmp'); + 3 : picture.bitmap:=Formprinc.Image3feux.picture.Bitmap; + //picture.Bitmap.LoadFromFile('3feux.bmp'); + 4 : picture.bitmap:=Formprinc.Image4feux.picture.Bitmap; + //picture.Bitmap.LoadFromFile('4feux.bmp'); + 5 : picture.bitmap:=Formprinc.Image5feux.picture.Bitmap; + //picture.Bitmap.LoadFromFile('5feux.bmp'); + 7 : picture.bitmap:=Formprinc.Image7feux.picture.Bitmap; + //picture.Bitmap.LoadFromFile('7feux.bmp'); + //9 : picture.Bitmap.LoadFromFile('9feux.bmp'); + 9 : picture.bitmap:=Formprinc.Image9feux.picture.Bitmap; + + + end; + // mettre rouge par défaut + if feux[rang].aspect=2 then EtatSignalCplx[feux[rang].adresse]:=violet_F; + if feux[rang].aspect=3 then EtatSignalCplx[feux[rang].adresse]:=semaphore_F; + if feux[rang].aspect>3 then EtatSignalCplx[feux[rang].adresse]:=carre_F; + + dessine_feu(feux[rang].adresse); + //if feux[rang].aspect=5 then cercle(Picture.Bitmap.Canvas,13,22,6,ClYellow); + end; + + // créée le label pour afficher son adresse + Feux[rang].Lbl:=Tlabel.create(Formprinc.ScrollBox1); + with Feux[rang].Lbl do + begin + caption:='@'+IntToSTR(Feux[rang].adresse); + Parent:=Formprinc.ScrollBox1; + width:=100;height:=20; + Top:=HtImg+((HtImg+EspY+20)*((rang-1) div NbreImagePLigne)); + Left:=10+ (LargImg+5)*((rang-1) mod (NbreImagePLigne)); + BringToFront; + end; + + // créée le checkBox si un feu blanc est déclaré sur ce feu + if feux[rang].FeuBlanc then + begin + Feux[rang].check:=TCheckBox.create(Formprinc.ScrollBox1); // ranger l'adresse de la Checkbox dans la structure du feu + Feux[rang].check.onClick:=formprinc.proc_checkBoxFB; // affecter l'adresse de la procédure de traitement quand on clique dessus + Feux[rang].check.Hint:=intToSTR(rang); // affecter l'index du feu dans le HINT pour pouvoir le retrouver plus tard + + with Feux[rang].Check do + begin + caption:='dem FB'; + Parent:=Formprinc.ScrollBox1; + width:=100;height:=15; + Top:=HtImg+15+((HtImg+EspY+20)*((rang-1) div NbreImagePLigne)); + Left:=10+ (LargImg+5)*((rang-1) mod (NbreImagePLigne)); + BringToFront; + end; + end; +end; + +// calcule le checksum d'une trame +Function Checksum(s : string) : string; +var i : integer; + check : byte; +begin + check:=0; + // on commence à 3 pour ne pas calculer le checksum sur FF FE + for i:=3 to length(s) do + begin + check:=check xor ord(s[i]); + end; + checksum:=s+char(check); +end; + +// renvoie une chaine ASCI Hexa affichable à partir d'une chaîne +function chaine_HEX(s: string) : string; +var i : integer; + sa_hex: string; +begin + sa_hex:=''; + for i:=1 to length(s) do + begin + sa_hex:=sa_hex+IntToHex(ord(s[i]),2)+' '; + end; + chaine_HEX:=sa_hex; +end; + +// Affiche une chaîne en Hexa Ascii +procedure affiche_chaine_hex(s : string;couleur : Tcolor); +begin + if trace then Affiche(chaine_HEX(s),couleur); +end; + +// temporisation en x 100 ms (0,1 s) +procedure Tempo(ValTemps : integer); +begin + temps:=Valtemps; + repeat + Application.ProcessMessages; + until (temps<=0); +end; + +// envoi d'une chaîne à la centrale par USBLenz ou socket, puis attend l'ack ou le nack +function envoi(s : string) : boolean; +var temps : integer; +begin + if Hors_tension2=false then + begin + if Trace then affiche_chaine_Hex(s,ClGreen); + if portCommOuvert then FormPrinc.MSComm1.Output:=s; + if parSocket then Formprinc.ClientSocketLenz.Socket.SendText(s); + // attend l'ack + ack:=false;nack:=false; + if portCommOuvert or ParSocket then + begin + temps:=0; + repeat + inc(temps);tempo(1); + until ferme or ack or nack or (temps>5); // l'interface répond < 5s en mode normal et 1,5 mn en mode programmation + if not(ack) or nack then + begin + Affiche('Pas de réponse de l''interface',clRed);inc(pasreponse); + if pasreponse>3 then hors_tension2:=true; + end; + if ack then begin pasreponse:=0;hors_tension2:=false;end; + end; + end; + envoi:=ack; +end; + +// insère l'id pour le serveur CDM dans une chaîne +function place_id(s : string) : string; +begin + delete(s,5,2); + insert(id_cdm,s,5); + place_id:=s; +end; + +// prépare la chaîne de commande pour un accessoire via CDM +Function chaine_CDM_Acc(adresse,etat1 : integer) : string; +var so,sx,s : string; + i : integer; +begin + { exemple de commande envoyée au serveur pour un manoeuvrer accessoire + C-C-00-0004-CMDACC-DCCAC|018|02|AD=100;STATE=1; + " NAME : nom de l'aiguille + " OBJ: numéro CDM-Rail de l'aiguille (index) + " AD: adresse (DCC) de l'aiguille + " AD2: adresse #2 (DCC) de l'aiguille (TJD bi-moteurs ou aiguille triples) + " STATE: état de l'aiguille + o 0: position droite (non déviée) + o 1: dévié (TJD, bretelles doubles) + o 2: dévié droit + o 3: dévié gauche + o 4: pos. droite #2 (TJD 4 états) + o 5: pos. déviée #2 (TJD 4 états) + } + so:=place_id('C-C-01-0004-CMDACC-DCCAC'); + //s:='NAME='+format('%.*d',[2,24])+';'; + //s:=s+'OBJ='+format('%.*d',[2,24])+';'; + s:=s+'AD='+format('%.*d',[1,adresse])+';'; + s:=s+'STATE='+format('%.*d',[1,etat1])+';'; + + sx:=format('%.*d',[2,2])+'|'; // 2 paramètres + so:=so+ '|'+format('%.*d',[3,length(s)+length(sx)])+'|'+sx; + + chaine_CDM_Acc:=so+s; +end; + +// envoi d'une chaîne à CDM par socket, puis attend l'ack ou le nack +function envoi_CDM(s : string) : boolean; +var temps : integer; +begin + //if Trace then + //if NivDebug=3 then begin AfficheDebug('Envoi à CDM rail',clRed);afficheDebug(s,ClGreen);end; + if parSocketCDM then Formprinc.ClientSocketCDM.Socket.SendText(s); + // attend l'ack + ackCDM:=false;nackCDM:=false; + if ParSocketCDM then + begin + temps:=0; + repeat + inc(temps);tempo(1); + until ferme or ackCDM or nackCDM or (temps>2); // CDM répond < 1s + if not(ackCDM) or nack then + begin + Affiche('Pas de réponse de CDM Rail',clRed); + end; + end; + envoi_CDM:=ackCDM; +end; + +// active ou désactive une sortie. Une adresse comporte deux sorties identifiées par "octet" +// Adresse : adresse de l'accessoire +// octet : numéro (1-2) de la sortie à cette adresse +// etat : false (désactivé) true (activé) +procedure pilote_direct(adresse:integer;octet : byte;etat : boolean); +var groupe : integer ; + fonction : byte; + s : string; +begin + groupe:=(adresse-1) div 4; + fonction:=((adresse-1) mod 4)*2 + (octet-1); + // pilotage + if etat then + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $80) + else + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $88); + + s:=checksum(s); + envoi(s); // envoi de la trame et attente Ack +end; + +procedure pilote_direct01(adresse:integer;octet:integer); +var groupe : integer ; + fonction : byte; + s : string; +begin + if octet=0 then octet:=2; + groupe:=(adresse-1) div 4; + fonction:=((adresse-1) mod 4)*2 + (octet-1); + // pilotage + if octet=2 then + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $80) + else + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $88); + + s:=checksum(s); + if envoi(s) then exit else envoi(s); // envoi de la trame et attente Ack sinon renvoyer +end; + + +// pilotage d'un accessoire (décodeur d'aiguillage, de signal) +// octet = 0 ou 1 ou 2 +// la sortie "octet" est mise à 1 puis à 0 +// acc = aig ou feu +procedure pilote_acc(adresse : integer;octet : byte;Acc : TAccessoire); +var groupe,temps : integer ; + fonction : byte; + s : string; +begin + if CDM_connecte then + begin + //AfficheDebug(intToSTR(adresse),clred); + s:=chaine_CDM_Acc(adresse,octet); + envoi_CDM(s); + if acc=feu then exit; + s:=chaine_CDM_Acc(adresse,0); + envoi_CDM(s); + exit; + end; + // test si pilotage inversé + //Affiche('Accessoire '+intToSTR(adresse),clLime); + if hors_tension2=false then + begin + if aiguillage[adresse].inversion=1 then + begin + if octet=1 then octet:=2 else octet:=1; + end; + if (octet=0) or (octet>2) then exit; + groupe:=(adresse-1) div 4; + fonction:=((adresse-1) mod 4)*2 + (octet-1); + // pilotage à 1 + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $88); // activer la sortie + s:=checksum(s); + envoi(s); // envoi de la trame et attente Ack + // si l'accessoire est un feu, sortir + if acc=feu then exit; + + // si aiguillage, faire une temporisation + if index_feu(adresse)=0 then + begin + temps:=aiguillage[adresse].temps;if temps=0 then temps:=4; + if portCommOuvert or ParSocket then tempo(temps); + end; + // pilotage à 0 pour éteindre le pilotage de la bobine du relais + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $80); // désactiver la sortie + s:=checksum(s); + envoi(s); // envoi de la trame et attente Ack + end; +end; + +// pilote accessoire en entrée 0->2 1->1 +procedure pilote_acc01(adresse : integer;octet : byte); +var groupe,temps : integer ; + fonction : byte; + s : string; +begin + // test si pilotage inversé + if octet=0 then octet:=2; + if aiguillage[adresse].inversion=1 then + begin + if octet=1 then octet:=2 else octet:=1; + end; + if (octet=0) or (octet>2) then exit; + groupe:=(adresse-1) div 4; + fonction:=((adresse-1) mod 4)*2 + (octet-1); + // pilotage à 1 + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $88); // activer la sortie + s:=checksum(s); + envoi(s); // envoi de la trame et attente Ack + sleep(10); // temps minimal pour ne pas avoir le défaut station occupée qd on pilote un signal leb + temps:=aiguillage[adresse].temps;if temps=0 then temps:=4; + // si l'accessoire est un feu, fixer l tempo à 1 + //if index_feu(adresse)<>0 then temps:=1; + + //if portCommOuvert or ParSocket then tempo(temps); + // pilotage à 0 pour éteindre le pilotage de la bobine du relais + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $80); // désactiver la sortie + s:=checksum(s); + envoi(s); // envoi de la trame et attente Ack +end; + +procedure vitesse_loco(loco : integer;vitesse : integer;sens : boolean); +var s : string; +begin + if sens then vitesse:=vitesse or 128; + s:=#$ff+#$fe+#$e4+#$13+#$0+char(loco)+char(vitesse); + s:=checksum(s); + envoi(s); +end; + +function testBit(n : word;position : integer) : boolean; +begin + testBit:=n and (1 shl position) = (1 shl position); +end; + +Function RazBit(n : word;position : integer) : word; +begin + RazBit:=n and not(1 shl position); +end; + +Function SetBit(n : word;position : integer) : word; +begin + SetBit:=n or (1 shl position); +end; + +// mise à jour état signal complexe dans le tableau de bits du signal EtatSignalCplx */ +// adresse : adresse du signal complexe +// Aspect : code représentant l'état du signal de 0 à 15 +procedure Maj_Etat_Signal(adresse,aspect : integer); +begin + if testBit((EtatSignalCplx[adresse]),aspect)=false then // si le bit dans l'état du signal n'est pas allumé, procéder. + begin + // effacement du motif de bits en fonction du nouvel état demandé suivant la règle des signaux complexes + if (aspect<=blanc_cli) then + begin + EtatSignalCplx[adresse]:=0; //Tout aspect <=7 efface les autres + end; + if (aspect=jaune) then // jaune + begin + EtatSignalCplx[adresse]:=RazBit(EtatSignalCplx[adresse],jaune_cli); // cas du jaune: efface le bit du jaune clignotant (bit 9) + EtatSignalCplx[adresse]:=RazBit(EtatSignalCplx[adresse],ral_30); // cas du jaune: efface le bit du ral_30 (bit 10) + EtatSignalCplx[adresse]:=RazBit(EtatSignalCplx[adresse],ral_60); // cas du jaune: efface le bit du ral_60 (bit 11) + EtatSignalCplx[adresse]:=EtatSignalCplx[adresse] and $FF00; // et effacer les bits 0 à 7 + end; + if (aspect=jaune_cli) then // jaune clignotant + begin + EtatSignalCplx[adresse]:=RazBit(EtatSignalCplx[adresse],jaune); // cas du jaunecli: efface le bit du jaune (bit 8) + EtatSignalCplx[adresse]:=EtatSignalCplx[adresse] and $FF00; // et effacer les bits 0 à 7 + end; + if (aspect=ral_30) then // ralentissement 30 + begin + EtatSignalCplx[adresse]:=EtatSignalCplx[adresse] and not($38FF); // cas du ral30: efface les bits 0 1 2 3 4 5 6 7 11 12 et 13 : 11 1000 1111 1111 + end; + if (aspect=ral_60) then // ralentissement 60 + begin + EtatSignalCplx[adresse]:=EtatSignalCplx[adresse] and not($34FF); // cas du ral60: efface les bits 10 12 et 13 et de 0 à 7 : 11 0100 1111 1111 + end; + if (aspect=rappel_30) then // rappel 30 + begin + EtatSignalCplx[adresse]:=EtatSignalCplx[adresse] and not($2c00); // cas du rappel30: efface les bits 10 11 et 13 : 10 1100 0000 0000 + end; + if (aspect=rappel_60) then // rappel 60 + begin + EtatSignalCplx[adresse]:=EtatSignalCplx[adresse] and not($1C00); // cas du rappel60: efface les bits 10 11 et 12 1 1100 0000 0000 + end; + if (aspect=aspect8) then // ral_60_jaune_cli décodeur LDT + begin + EtatSignalCplx[adresse]:=jaune_cli_F or ral_60_F; // cas du ralentissement 60 + avertissement clignotant : efface les bits 10 11 et 12 + end; + if (aspect<>aspect8) then EtatSignalCplx[adresse]:=SetBit(EtatSignalCplx[adresse],aspect); // allume le numéro du bit de la fonction du signal + end; +end; + + +{============================================= +envoie les données au décodeur digital bahn équipé du logiciel "led_schalten" +sur un panneau directionnel - adresse : adresse du signal - code de 1 à 3 pour allumer +; le panneau directionnel à 1, 2 ou 3 leds. +============================================== } +procedure envoi_directionBahn(adr : integer;code : integer); +begin + if (EtatSignalCplx[adr]<>code) then + begin + if (traceSign) then Affiche('Signal directionnel '+IntToSTR(adr)+' '+intToSTR(code),clOrange); + case code of + 0 : begin pilote_acc(adr,1,feu); // sortie 1 à 0 + sleep(tempoFeu); + pilote_acc(adr+1,1,feu); // sortie 2 à 0 + sleep(Tempofeu); + pilote_acc(adr+2,1,feu); // sortie 3 à 0 + sleep(TempoFeu); + end; + 1 : begin pilote_acc(adr,2,feu); // sortie 1 à 1 + sleep(tempoFeu); + pilote_acc(adr+1,1,feu); // sortie 2 à 0 + sleep(Tempofeu); + pilote_acc(adr+2,1,feu); // sortie 3 à 0 + sleep(TempoFeu); + end; + 2 : begin pilote_acc(adr,2,feu); // sortie 1 à 1 + sleep(tempoFeu); + pilote_acc(adr+1,2,feu); // sortie 2 à 1 + sleep(Tempofeu); + pilote_acc(adr+2,1,feu); // sortie 3 à 0 + sleep(TempoFeu); + end; + 3 : begin pilote_acc(adr,2,feu); // sortie 1 à 1 + sleep(tempoFeu); + pilote_acc(adr+1,2,feu); // sortie 2 à 1 + sleep(Tempofeu); + pilote_acc(adr+2,2,feu); // sortie 3 à 1 + sleep(TempoFeu); + end; + end; + EtatSignalCplx[adr]:=code; + end; +end; + + +{ ============================================= +envoie les données au signal de direction pour un décodeur CDF +adresse : adresse du signal - code de 1 à 3 pour allumer +le panneau directionnel à 1, 2, 3 ou 4 leds. +============================================== } +procedure envoi_directionCDF(adr : integer;code : integer); +begin + if (EtatSignalCplx[adr]<>code) then + begin + if traceSign then Affiche('signal directionnel CDF: '+IntToSTR(adr)+' '+intToSTR(code),ClOrange); + + case code of + // éteindre toutes les leds + 0 : + begin + pilote_acc(adr,1,feu) ; + sleep(200); + end; + // code 1 : allume le feu le plus à gauche + 1 : + begin + pilote_acc(adr,2,feu) ; + sleep(200); + end; + 2 : //allume 2 feux + begin + pilote_acc(adr+1,1,feu) ; + sleep(200); + end; + // code 3 : allume 3 feux + 3 : + begin + pilote_acc(adr+1,2,feu) ; + sleep(200); + end; + end; + EtatSignalCplx[adr]:=code; + end; +end; + +{========================================================================== +envoie les données au décodeur CDF pour un signal +===========================================================================*} +procedure envoi_CDF(adresse : integer); +var code,aspect,index : integer; +begin + index:=Index_feu(adresse); // tranforme l'adresse du feu en index tableau + code:=feux[index].aspect; // aspect du feu; + if (ancien_tablo_signalCplx[adresse]<>EtatSignalCplx[adresse]) then //; && (stop_cmd==FALSE)) + begin + ancien_tablo_signalCplx[adresse]:=EtatSignalCplx[adresse]; + aspect:=code_to_aspect(code); + if traceSign then affiche('Signal CDF: '+intToSTR(adresse)+' '+intToSTR(code),clOrange); + + if (aspect=carre) then pilote_acc(adresse,2,feu) ; + if (aspect=semaphore) then pilote_acc(adresse,1,feu) ; + if (aspect=vert) then pilote_acc(adresse+1,1,feu) ; + if (aspect=jaune) then pilote_acc(adresse+1,2,feu); + // signalisation non combinée rappel 30 seul + if (aspect=rappel_30) then pilote_acc(adresse+1,1,feu); + + // 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 + end; +end; + +{========================================================================== +envoie les données au décodeur LEB pour un signal +===========================================================================*} +procedure envoi_LEB(adr : integer); +var codebin,aspect : integer; + s : string; + procedure envoi5_LEB(selection :byte); + var i : integer; + begin + s:=''; + for i:=0 to 4 do + begin + if (testBit(selection,i)) then begin pilote_acc(adr+i,1,feu);s:=s+'1';end + else begin pilote_acc(adr+i,2,feu) ; s:=s+'0';end; + //if (testBit(selection,i)) then begin pilote_acc(adr+i,1);s:=s+'1';end + //else begin pilote_acc(adr+i,2) ; s:=s+'0';end; + //Sleep(50); + end; + //Affiche(inttoStr(selection),clOrange); + //Affiche(s,clOrange); + end; +begin + +if (ancien_tablo_signalCplx[adr]<>EtatSignalCplx[adr]) then //; && (stop_cmd==FALSE)) +begin + ancien_tablo_signalCplx[adr]:=EtatSignalCplx[adr]; + codebin:=EtatSignalCplx[adr]; + aspect:=code_to_aspect(codebin); + if traceSign then + begin + s:='Signal LEB: ad'+IntToSTR(adr)+'='+etatSign[aspect]; + //s:='Signal LEB: ad'+IntToSTR(adr)+' aspect='+intToSTR(aspect)+' combine='+intToSTR(combine); + if Combine<>0 then s:=s+' + '+etatSign[combine]; + Affiche(s,clYellow); + end; + Sleep(40); // si le feu se positionne à la suite d'un positionnement d'aiguillage, on peut avoir le message station occupée + + if (Combine=0) then + begin + if (aspect=carre) then envoi5_LEB(0); + if (aspect=violet) then envoi5_LEB(1); + if (aspect=blanc_cli) then envoi5_LEB(2); + if (aspect=blanc) then envoi5_LEB(3); + if (aspect=semaphore) then envoi5_LEB(4); + if (aspect=semaphore_cli) then envoi5_LEB(5); + if (aspect=jaune) then envoi5_LEB(8); + if (aspect=jaune_cli) then envoi5_LEB($a); + if (aspect=vert_cli) then envoi5_LEB($c); + if (aspect=vert) then envoi5_LEB($d); + if (aspect=rappel_30) then envoi5_LEB(6); + if (aspect=rappel_60) then envoi5_LEB(7); + if (aspect=ral_30) then envoi5_LEB(9); + if (aspect=ral_60) then envoi5_LEB($b); + end; + if (aspect=0) then + begin + if (Combine=rappel_30) then envoi5_LEB(6); + if (Combine=rappel_60) then envoi5_LEB(7); + if (Combine=ral_30) then envoi5_LEB(9); + if (Combine=ral_60) then envoi5_LEB($b); + end; + if ((Combine=rappel_30) and (aspect=jaune)) then envoi5_LEB($e); + if ((Combine=rappel_30) and (aspect=jaune_cli)) then envoi5_LEB($f); + 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); +end; +end; + +(*========================================================================== +envoie les données au décodeur NMRA étendu + adresse=adresse sur le BUS DCC + code=code d'allumage : +0. Carré +1. Sémaphore +2. Sémaphore clignotant +3. Vert +4. Vert clignotant +5. Carré violet +6. Blanc +7. Blanc clignotant +8. Avertissement +9. Avertissement clignotant +10. Ralentissement 30 +11. Ralentissement 60 +12. Ralentissement 60 + avertissement clignotant +13. Rappel 30 +14. Rappel 60 +15. Rappel 30 + avertissement +16. Rappel 30 + avertissement clignotant +17. Rappel 60 + avertissement +18. rappel 60 + avertissement clignotant + +/*===========================================================================*) +procedure envoi_NMRA(adresse,code : integer); +var valeur : integer ; +begin + if (ancien_tablo_signalCplx[adresse]<>EtatSignalCplx[adresse]) then + begin + ancien_tablo_signalCplx[adresse]:=EtatSignalCplx[adresse]; + case (code) of + carre_F : valeur:=0; + semaphore_F : valeur:=1; + semaphore_cli_F : valeur:=2; + vert_F : valeur:=3; + vert_cli_F : valeur:=4; + violet_F : valeur:=5; + blanc_F : valeur:=6; + blanc_cli_F : valeur:=7; + jaune_F : valeur:=8; + jaune_cli_F : valeur:=9; + ral_30_F : valeur:=10; + ral_60_F : valeur:=11; + (ral_60_F + jaune_cli_F) : valeur:=12; + (rappel_30_F) : valeur:=13; + (rappel_60_F) : valeur:=14; + (rappel_30_F + jaune_F) : valeur:=15; + (rappel_30_F + jaune_cli_F) : valeur:=16; + (rappel_60_F + jaune_F) : valeur:=17; + (rappel_60_F + jaune_cli_F) : valeur:=18; + else valeur:=code; + end; + pilote_acc(adresse,valeur,feu); + end; +end; + + +{========================================================================== +envoie les données au décodeur LDT + adresse=adresse sur le BUS DCC + code=code d'allumage selon l'adressage (ex carre, vert, rappel_30 ..). + mode=mode du décodeur adressé, de 1 à 2 + un décodeur occupe 8 adresses + Le mode 1 permet la commande des signaux de 2, 3 et 4 feux + Le mode 2 permet la commande de signaux de plus de 4 feux +===========================================================================} +procedure envoi_LDT(adr : integer); +var index,codebin,aspect,mode : integer; +begin + codebin:=EtatSignalCplx[adr]; + aspect:=code_to_aspect(codebin); + if (ancien_tablo_signalCplx[adr]<>EtatSignalCplx[adr]) then //; && (stop_cmd==FALSE)) + begin + ancien_tablo_signalCplx[adr]:=EtatSignalCplx[adr]; + //if (tempo_ACC>0) then sleep(100); // les commandes entre 2 feux successives doivent être séparées au minimum de 100 ms + if traceSign then affiche('Signal LDT: '+IntToSTR(adr)+' '+intToSTR(mode)+' '+intTOSTR(codebin),clOrange); + if (aspect=semaphore) or (aspect=vert) or (aspect=carre) or (aspect=jaune) then mode:=1 else mode:=2; + + case mode of + // pour les décodeurs en mode 0, il faut écrire la routine vous même car le pilotage dépend du cablage + // sauf pour le sémaphore, vert et jaune fixe + 1 : // mode 1: feux 2 3 & 4 feux + begin + if (aspect=semaphore) then pilote_acc(adr,1,feu); + if (aspect=vert) then pilote_acc(adr,2,feu); + if (aspect=carre) then pilote_acc(adr+1,1,feu); + if (aspect=jaune) then pilote_acc(adr+1,2,feu); + end; + 2 : // mode 2: plus de 4 feux + begin + if (aspect=semaphore) then begin pilote_acc(adr+2,1,feu);sleep(tempoFeu);pilote_acc(adr,1,feu);end; + if (aspect=vert) then begin pilote_acc(adr+2,1,feu);sleep(tempoFeu);pilote_acc(adr,2,feu);end; + if (aspect=carre) then begin pilote_acc(adr+2,1,feu);sleep(tempoFeu);pilote_acc(adr+1,1,feu);end; + if (aspect=jaune) then begin pilote_acc(adr+2,1,feu);sleep(tempoFeu);pilote_acc(adr+1,2,feu);end; + if (aspect=violet) then begin pilote_acc(adr+2,2,feu);sleep(tempoFeu);pilote_acc(adr,1,feu);end; + if (aspect=blanc) then begin pilote_acc(adr+2,2,feu);sleep(tempoFeu);pilote_acc(adr,2,feu);end; + if (aspect=semaphore) then begin pilote_acc(adr+2,2,feu);sleep(tempoFeu);pilote_acc(adr+1,1,feu);end; + if (aspect=aspect8) then begin pilote_acc(adr+2,2,feu);sleep(tempoFeu);pilote_acc(adr+1,2,feu);end; + if (aspect=ral_60_jaune_cli) then begin pilote_acc(adr+3,1,feu);sleep(tempoFeu);pilote_acc(adr,1,feu);end; // demande groupe 3 + if (aspect=vert_cli) then begin pilote_acc(adr+3,1,feu);sleep(tempoFeu);pilote_acc(adr,2,feu);end; // demande groupe 3 + if (aspect=Disque_D) then begin pilote_acc(adr+3,1,feu);sleep(tempoFeu);pilote_acc(adr+1,1,feu);end;// demande groupe 3 + if (aspect=jaune_cli) then begin pilote_acc(adr+3,1,feu);sleep(tempoFeu);pilote_acc(adr+1,2,feu);end; + if (aspect=ral_30) then begin pilote_acc(adr+3,2,feu);sleep(tempoFeu);pilote_acc(adr,1,feu);end; + if (aspect=ral_60) then begin pilote_acc(adr+3,2,feu);sleep(tempoFeu);pilote_acc(adr,2,feu);end; + if (aspect=rappel_30) then begin pilote_acc(adr+3,2,feu);sleep(tempoFeu);pilote_acc(adr+1,1,feu);end; + if (aspect=rappel_60) then begin pilote_acc(adr+3,2,feu);sleep(tempoFeu);pilote_acc(adr+1,2,feu);end; + end; + end; + end; +end; + + +procedure envoi_virtuel(adresse : integer); +var + aspect,code : integer; +begin + code:=etatsignalcplx[adresse]; + if (ancien_tablo_signalCplx[adresse]<>EtatSignalCplx[adresse]) then //; && (stop_cmd==FALSE)) + begin + ancien_tablo_signalCplx[adresse]:=EtatSignalCplx[adresse]; + aspect:=code_to_aspect(code); // transforme le motif de bits en numéro "code des aspects des signaux" + if (tracesign) then Affiche('Signal virtuel: '+intToSTR(adresse)+' Etat '+etatSign[aspect],clyellow); + end; +end; + +(*========================================================================== +envoie les données au décodeur digitalbahn équipé du logiciel "led_signal_10" + adresse=adresse sur le BUS DCC + codebin=motif de bits représentant l'état des feux L'allumage est fait en + adressant l'une des 14 adresses pour les 14 leds possibles du feu. + Ici on met le bit 1 à 1 (état "vert" du programme hexmanipu +===========================================================================*) +//procedure envoi_signalBahn(adresse,codebin : integer); +procedure envoi_signalBahn(adresse : integer); +var aspect,combineLoc,codebin : integer; + ralrap, jau ,Ancralrap,Ancjau : boolean; + s : string; +begin +// s:='@='+IntToSTR(adresse)+' '+intToSTR(ancien_tablo_signalCplx[adresse])+' '+intToSTR(EtatsignalCplx[adresse]); +// affiche(s,ClYellow); + if (ancien_tablo_signalCplx[adresse]<>EtatSignalCplx[adresse]) then //; && (stop_cmd==FALSE)) + begin + codebin:=EtatSignalCplx[adresse]; + aspect:=code_to_aspect(codebin); // transforme le motifs de bits en numéro "code des aspects des signaux" + combineLoc:=combine; // copier dans variable locale + //dessine_feu(adresse); + if traceSign then + begin + s:='Signal bahn: ad'+IntToSTR(adresse)+'='+etatSign[aspect]; + if CombineLoc<>0 then s:=s+' + '+etatSign[combineLoc]; + Affiche(s,clOrange); + end; + // spécifique au décodeur digital bahn: + // si le signal affichait un signal combiné, il faut éteindre le signal avec un sémaphore + // avant d'afficher le nouvel état non combiné + Ancralrap:=(TestBit(ancien_tablo_signalCplx[adresse],ral_30)) or (TestBit(ancien_tablo_signalCplx[adresse],ral_60)) or + (TestBit(ancien_tablo_signalCplx[adresse],rappel_30)) or (TestBit(ancien_tablo_signalCplx[adresse],rappel_60)) ; + // si ancien état du signal=jaune ou jaune cli + Ancjau:=(TestBit(ancien_tablo_signalCplx[adresse],jaune)) or (TestBit(ancien_tablo_signalCplx[adresse],jaune_cli)) ; + + // si état demandé du signal=ralentissement ou rappel + ralrap:=(TestBit(codebin,ral_30)) or (TestBit(codebin,ral_60)) or + (TestBit(codebin,rappel_30)) or (TestBit(codebin,rappel_60)) ; + // si état demandé du signal=jaune ou cli + jau:=TestBit(codebin,jaune) or TestBit(codebin,jaune_cli) ; + + //effacement du signal combiné par sémaphore suivant condition + if (((Ancralrap and not(ralrap)) or (Ancjau and not(jau))) and (aspect>=8)) then + begin + Sleep(40); + pilote_acc(adresse+semaphore,2,feu) ; + // dessine_feu(adresse); + end; + + ancien_tablo_signalCplx[adresse]:=EtatSignalCplx[adresse]; + + sleep(40); // les commandes entre 2 feux successifs doivent être séparées au minimum de 100 ms + // affichage du premier aspect du signal(1er bit à 1 dans codebin + pilote_acc(adresse+aspect,2,feu) ; + + + // affichage de la signalisation combinée (2ème bit à 1 dans codebin) + if (CombineLoc<>0) then + begin + sleep(40); + pilote_ACC(adresse+CombineLoc,2,feu) ; + end; + dessine_feu(adresse); + end; +end; + +//évaluation des signaux ancienne version==================================================================*/ +procedure signaux; +var Num_voie,signalCplx,i : integer; + PresTrain,a,b,c : boolean; +begin +// signal 176 =========================================================*/ +signalCplx:=176; +a:=MemZone[524,521] and (aiguillage[8].position=2); +b:=MemZone[514,522] and (aiguillage[8].position<>2); +PresTrain:=MemZone[527,520] or ((aiguillage[7].position<>2) and ( a or b or MemZone[521,527] or MemZone[522,527])); +if (((aiguillage[20].position<>2) and (aiguillage[12].position<>2)) or (PresTrain=FALSE)) then + Maj_Etat_Signal(signalCplx,carre) +else +begin + // si train quitte zone de détection du signal + if ( (MemZone[520,530] and (aiguillage[20].position=2) and (aiguillage[26].position=2)) or + (MemZone[520,529] and (aiguillage[20].position=2) and (aiguillage[26].position<>2)) or + (MemZone[520,517] and (aiguillage[20].position<>2)) ) then + begin + if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin // 26==0 : voie droite <>0 : voie gauche + a:=((aiguillage[20].position<>2) and (testBit(EtatSignalCplx[358],carre)) or (testbit(EtatSignalCplx[358],semaphore))); + b:=((aiguillage[20].position=2) and (testBit(EtatSignalCplx[420],carre)) or (testbit(EtatSignalCplx[420], semaphore))); + + if (a or b) then + begin // si signal complexe suivant est au carré ou sémaphore + Maj_Etat_Signal(signalCplx,jaune); // afficher un avertissement + end + else + begin + if ((aiguillage[11].position<>2) and (aiguillage[20].position<>2) + and (aiguillage[12].position=2) and (aiguillage[18].position<>2)) then // si aiguille suivante prise en pointe est déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30); // afficher ralentissement + end + else + begin + a:=(aiguillage[20].position<>2) and testbit(EtatSignalCplx[358],jaune); + b:=((aiguillage[20].position=2) and testbit(EtatSignalCplx[420],jaune)); + if (a or b) then // si signal cplx suivant est jaune + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,jaune_cli); // afficher un avertissement clignotant sur le signal complexe + end + else Maj_Etat_Signal(signalCplx,vert); // sinon afficher un feu vert + end; + end; + end; +end; + +// signal 190 ================================================================ */ +signalCplx:=190; +if memZone[523,526]=true then // si train quite zone de détection du signal + begin + Maj_Etat_Signal(signalCplx,semaphore); // mettre un sémaphore} + end + else + begin + if testBit(EtatSignalCplx[302],carre) or testBit(EtatSignalCplx[302],semaphore) then // si signal complexe suivant= carré ou sémaphore + // Maj_Etat_Signal(signalCplx,jaune); // + Maj_Etat_Signal(signalCplx,semaphore_cli) + else + begin + if (aiguillage[9].position<>2) then // si aiguille suivante déviée? + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if testBit(EtatSignalCplx[302],jaune) then // si signal suivant jaune ? + Maj_Etat_Signal(signalCplx,jaune_cli); + Maj_Etat_Signal(signalCplx,ral_60); // afficher ralentissement + end + else // aiguille 9 droite + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if testBit(EtatSignalCplx[302],jaune_F) then // si signal cplx suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + + +// signal 204 ============================================================*/ + signalCplx:=204; + PresTrain:=(aiguillage[8].position=2) and (MemZone[521,527] or MemZone[524,521]) + or ((aiguillage[8].position<>2) and (MemZone[522,527] or MemZone[514,522] or MemZone[518,514])); + if (PresTrain=FALSE) then Maj_Etat_Signal(signalCplx,carre) // si pas de train avant le signal, mettre au carré + else + begin + if ( (MemZone[527,520] and (aiguillage[7].position<>2)) or + (MemZone[527,519] and (aiguillage[7].position=2)) ) then // si train quitte détection signal + begin + if (TestBit(EtatSignalCplx[signalCplx],carre)=FALSE) then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if (aiguillage[7].position<>2) then // aiguille locale prise en pointe déviée? + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,rappel_30); // afficher rappel ralentissement + if (TestBit(EtatSignalCplx[176],carre)) or (testBit(EtatSignalCplx[176],semaphore)) then // si signal complexe suivant rouge + Maj_Etat_Signal(signalCplx,jaune) + else + if TestBit(EtatSignalCplx[176],jaune) then // si signal complexe suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli); + end + else // pas aiguille locale déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + // si signal suivant est rouge + if TestBit(EtatSignalCplx[330],carre) or testBit(EtatSignalCplx[330],semaphore) then Maj_Etat_Signal(signalCplx,jaune) + else + begin + if TestBit(EtatSignalCplx[330],jaune) or TestBit(EtatSignalCplx[330],ral_30) + or TestBit(EtatSignalCplx[330],ral_60) then // si signal suivant est jaune ou ral_30 ou 60 + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; + +// signal 218 ============================================================*/ +signalCplx:=218; +if MemZone[525,528] or MemZone[525,535] then Maj_Etat_Signal(signalCplx,semaphore) // si train quitte zone détection du signal +else + // si signal suivant est rouge + begin + a:=(testBit(EtatSignalCplx[344],carre) or testBit(EtatSignalCplx[344],semaphore)) and (aiguillage[17].position<>2); + b:=(testBit(EtatSignalCplx[392],carre) or testBit(EtatSignalCplx[392],semaphore)) and (aiguillage[17].position=2); + if (a or b) then + begin + Maj_Etat_Signal(signalCplx,jaune); + end + else + begin + // si aiguille distante déviée + if ( ((aiguillage[19].position<>2) or ((aiguillage[19].position=2) and (aiguillage[22].position<>2))) and (aiguillage[17].position<>2) ) then + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30); + end + else + begin + // si signal suivant jaune + EtatSignalCplx[signalCplx]:=0; // raz état du signal + a:=testBit(EtatSignalCplx[344],jaune) and (aiguillage[17].position<>2); + b:=testBit(EtatSignalCplx[392],jaune) and (aiguillage[17].position=2); + if (a or b) then + begin + Maj_Etat_Signal(signalCplx,jaune_cli); + end + else + begin + Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; + +// signal 232 ============================================================*/ +signalCplx:=232; +if ((aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position=2) and (aiguillage[6].position<>0)) then +begin + if detecteur[516] then Maj_Etat_Signal(signalCplx,blanc) + else Maj_Etat_Signal(signalCplx,blanc_cli) +end +else Maj_Etat_Signal(signalCplx,violet); + +// signal 260 ============================================================*/ +signalCplx:=260; +// aiguilles vers manoeuvre +//i:=index_feu(SignalCplx); +//a:=(feux[i].check.checked=true) and (aiguillage[1].position<>2) and (aiguillage[3].position<>2) and (aiguillage[5].position=2) and detecteur[518]; +//b:=(aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position=2) and (aiguillage[6].position<>2); +//if (a or b) then Maj_Etat_Signal(signalCplx,blanc) // feu blanc +//else + begin + // équations de présence train avant signal + a:= MemZone[525,528] and (aiguillage[17].position<>2) and (aiguillage[10].position<>2); + b:= MemZone[526,513] and (aiguillage[10].position<>2); + PresTrain:=(a or b or MemZone[513,518] or MemZone[528,518]) and (aiguillage[19].position<>2); + + // équations d'aiguillages prises en talon mal positionnées + a:=((aiguillage[1].position<>2) and (aiguillage[3].position<>2) and (aiguillage[5].position<>2)); + b:=((aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position=2) and (aiguillage[6].position=2)); + a:=false;b:=false;prestrain:=true; + if (a or b or (PresTrain=FALSE)) then maj_Etat_Signal(signalCplx,carre) + else + begin //si train quitte zone 518 + a:=((MemZone[518,523] and (aiguillage[1].position=2)) or + (MemZone[518,515] and (aiguillage[1].position<>2) and (aiguillage[3].position<>2)) or + (MemZone[518,514] or MemZone[514,522]) and ((aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position<>2))); + if a then + begin + if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if feux[index_feu(signalCplx)].check.checked then Maj_Etat_Signal(signalCplx,blanc) + else + begin + if (aiguillage[1].position<>2) then // aiguille locale prise en pointe déviée? + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,rappel_30); // afficher rappel ralentissement + a:=((aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position<>2)) // vers voie 514 + and (testBit(EtatSignalCplx[288],carre) or testBit(EtatSignalCplx[288],semaphore)) ; // si signal complexe suivant rouge + b:=((aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position=2)) ; //ou voie en buttoir + if (a or b) then + Maj_Etat_Signal(signalCplx,jaune) + else + begin + if testBit(EtatSignalCplx[288],jaune) then // si signal complexe suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli); + end; + end + else // pas aiguille locale déviée + begin + // si signal suivant est rouge + EtatSignalCplx[signalCplx]:=0; // raz état du signal + a:=(aiguillage[1].position=2) and testBit(EtatSignalCplx[190],semaphore) or testBit(EtatSignalCplx[190],semaphore_cli) or testbit(EtatSignalCplx[190],carre); + //a:=a or (aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position=2) and (aiguillage[6].position<>2); + //a:=a or (aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position<>2) and TestBit(EtatSignalCplx[288],semaphore) or testBit(EtatSignalCplx[288],carre); + if a then Maj_Etat_Signal(signalCplx,jaune) + else + begin + if testBit(EtatSignalCplx[190],jaune) or testBit(EtatSignalCplx[190],ral_30) + or testBit(EtatSignalCplx[190],ral_60) then // si signal cplx suivant est jaune ou ral_30 ou 60 + Maj_Etat_Signal(signalCplx,jaune_cli) + else + begin + i:=Index_feu(signalCplx); + if feux[i].FeuBlanc then + begin + if feux[i].check.Checked then + Maj_etat_signal(signalCplx,blanc) else Maj_etat_signal(signalCplx,vert); + end + else Maj_etat_signal(signalCplx,vert); + end; + end; + end; + end; + end; + end; + end; + +// signal 274 ============================================================*/ + signalCplx:=274; + if MemZone[524,521] then // si train quite détection du signal + Maj_Etat_Signal(signalCplx,semaphore) + else + begin + if TestBit(EtatSignalCplx[600],carre) or testBit(EtatSignalCplx[600],semaphore) then + Maj_Etat_Signal(signalCplx,jaune) + else + begin + if testBit(EtatSignalCplx[600],ral_30) or testBit(EtatSignalCplx[600],jaune) then Maj_Etat_Signal(signalCplx,jaune_cli) + else + Maj_Etat_Signal(signalCplx,vert); + end; + end; + +// signal 288 =========================================================*/ +signalCplx:=288; +PresTrain:=MemZone[513,531] or MemZone[528,531] or MemZone[524,531] or MemZone[518,514] or MemZone[531,518] ; +//PresTrain:=(PresTrain and (aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position<>2) ); +PresTrain:=PresTrain or MemZone[514,522]; + +if ((PresTrain=FALSE) or (aiguillage[8].position=2)) then Maj_Etat_Signal(signalCplx,carre) +else +begin + if MemZone[522,527] then + begin + if TestBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); // sinon mettre un sémaphore} + end + else + begin + if TestBit(EtatSignalCplx[204],carre) or testBit(EtatSignalCplx[204],semaphore) then // si signal complexe suivant est au carré ou sémaphore + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,jaune); // afficher un avertissement + end + else + begin + if (aiguillage[7].position<>2) then // si aiguille suivante prise en pointe est déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30); // afficher ralentissement + end + else + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if testBit(EtatSignalCplx[204],jaune) then // si signal suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli) // afficher un avertissement clignotant sur le signal complexe + else Maj_Etat_Signal(signalCplx,vert); // sinon afficher un feu vert + end; + end; + end; +end; + +// signal 302 ============================================================*/ +signalCplx:=302; +PresTrain:=((MemZone[513,518] or MemZone[528,518] or MemZone[524,518]) and (aiguillage[1].position=2)) or MemZone[518,523] or MemZone[523,526] ; +if PresTrain=FALSE then Maj_Etat_Signal(signalCplx,carre) +else +begin + if (MemZone[526,513] and (aiguillage[9].position=2)) or + (MemZone[526,515] and (aiguillage[9].position<>2)) then // si train quitte zone de détection du signal + begin + if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then + Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if (aiguillage[9].position<>2) then // si aiguille locale déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,rappel_60); // afficher rappel ralentissement + if (testBit(EtatSignalCplx[316],carre) or testBit(EtatSignalCplx[316],semaphore )) then // si signal suivant rouge + Maj_Etat_Signal(signalCplx,jaune); + // signal suivant jaune avec aiguille locale déviée + if testBit(EtatSignalCplx[316],jaune) then // si signal cplx suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli); + end + else // si aiguille locale non déviée + begin + // si signal suivant rouge + if testBit(EtatSignalCplx[462],semaphore) or testBit(EtatSignalCplx[462],carre) then + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,jaune); + end + else + begin + // si aiguille suivante prise en pointe déviée + if ((aiguillage[19].position<>2) or ((aiguillage[19].position=2) and (aiguillage[22].position<>2))) then + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,jaune); // le ral30 est remplacé par avertissement sur ce signal + end + else + // si signal suivant est jaune ou ralentissement 30 + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if (testBit(EtatSignalCplx[462],jaune) or testBit(EtatSignalCplx[462],ral_30)) then + Maj_Etat_Signal(signalCplx,jaune_cli) + else + Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; +end; + +// signal 316 ============================================================*/ +signalCplx:=316; +// aiguillages vers voies de garage +if ( (aiguillage[5].position=2) and (aiguillage[3].position<>2) and (aiguillage[1].position<>2) ) or + ( feux[index_feu(signalCplx)].check.checked) then + begin + if detecteur[518] then Maj_Etat_Signal(signalCplx,blanc_cli) else Maj_Etat_Signal(signalCplx,blanc) ; + end +else +begin + PresTrain:=MemZone[526,515] or (((MemZone[518,523] and (aiguillage[1].position=2)) or MemZone[523,526]) and (aiguillage[9].position<>2)) ; + // équations d'aiguillages mal positionnés + + a:=((aiguillage[5].position=2) and (aiguillage[3].position=2)) or + ((aiguillage[5].position=2) and (aiguillage[1].position=2)) or + ((aiguillage[5].position<>2) and (aiguillage[2].position=2)) or + ((aiguillage[5].position<>2) and (aiguillage[2].position<>2) and (aiguillage[12].position=2)) ; + if a or (PresTrain=FALSE) then Maj_Etat_Signal(signalCplx,carre) + else + begin // train quitte zone de détection du signal + if ( (MemZone[515,517] and (aiguillage[5].position<>2)) or + (MemZone[515,518] and (aiguillage[5].position=2)) ) then + begin + if TestBit(EtatSignalCplx[signalCplx],carre)=false then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if feux[index_feu(signalCplx)].check.checked then Maj_Etat_Signal(signalCplx,blanc) + else + begin + if ( ((aiguillage[5].position<>2) and (aiguillage[2].position<>2)) and + (testBit(EtatSignalCplx[358],carre) or testBit(EtatSignalCplx[358],semaphore)) ) then // si signalCplx suivant est carré + Maj_Etat_Signal(signalCplx,jaune) + else + if ( ((aiguillage[5].position=2) and (aiguillage[3].position<>2) and (aiguillage[1].position<>2)) and // si signal suivant est rouge + (testBit(EtatSignalCplx[497],carre) or testBit(EtatSignalCplx[497],semaphore)) ) then + Maj_Etat_Signal(signalCplx,jaune) + else + begin + if (((aiguillage[11].position<>2) and (aiguillage[5].position<>2)) or + ((aiguillage[10].position<>2) and (aiguillage[5].position=2)) ) then + // si aiguille suivante prise en pointe est déviée + Maj_Etat_Signal(signalCplx,ral_30) // afficher ralentissement + + else + begin + // si aiguille suivante en pointe est déviée + if ((aiguillage[29].position<>2) and (aiguillage[5].position=2)) then// si aiguille suivante prise en pointe est déviée + begin + Maj_Etat_Signal(signalCplx,ral_60); // afficher ralentissement 60 + end + else + begin + // si signal suivant est jaune + if ( ((aiguillage[5].position=2) and (aiguillage[3].position<>2) and (aiguillage[1].position<>2)) and + (testBit(EtatSignalCplx[497],jaune)) ) then + Maj_Etat_Signal(signalCplx,jaune_cli) + else + if ( ((aiguillage[5].position<>2) and (aiguillage[2].position<>2)) and + (testBit(EtatSignalCplx[358],jaune)) ) then + Maj_Etat_Signal(signalCplx,jaune_cli) + else + Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; + end; + end; +end; + + +signalCplx:=330; //-------------------------------------------------------------------- +a:=MemZone[521,527] or MemZone[524,521] ; // and (aiguillage[8].position=0)) ; +b:=MemZone[522,527] or MemZone[514,522] or MemZone[518,514] or MemZone[514,522]; // and (aiguillage[8].position=0)) ; ///à voirrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +PresTrain:=MemZone[527,519] or ( (aiguillage[7].position=2) and (a or b)); + +// aiguilles 2 et 12 mal positionnées ou pas de train + if (aiguillage[2].position=1) or (aiguillage[12].position=2) or (PresTrain=FALSE) then + Maj_Etat_Signal(signalCplx,carre) // mettre un carré} + else + begin + //if (Mem_519_517=true) then + if MemZone[519,517] then + begin + if (testbit(EtatSignalCplx[signalCplx],carre)=FALSE) then Maj_Etat_Signal(signalCplx,semaphore); // sinon mettre un sémaphore} + end + else + begin + if (testbit(EtatSignalCplx[358],carre)) or (testbit(EtatSignalCplx[358],semaphore)) then // si signal complexe suivant est au carré ou sémaphore + Maj_Etat_Signal(signalCplx,jaune) // afficher un avertissement + else + begin + if (aiguillage[11].position<>2) then // si aiguille suivante prise en pointe est déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30); // afficher ralentissement + end + else + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if testbit(EtatSignalCplx[358],jaune) then // si signal suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli) // afficher un avertissement clignotant sur le signal complexe + else Maj_Etat_Signal(signalCplx,vert); // sinon afficher un feu vert + end; + end; + end; + end; + + +// signal 344============================================================*/ +signalCplx:=344; +PresTrain:=(MemZone[525,528] or MemZone[517,525] or MemZone[534,525] or MemZone[538,525]) and (aiguillage[17].position<>2); + +if (((aiguillage[10].position=2) or (aiguillage[10].position<>2) and (aiguillage[19].position=2) and + (aiguillage[22].position<>2) and (aiguillage[24].position<>2)) + or (PresTrain=FALSE) ) then // si aiguillage 10 non dévié ou pas de train avant signal + Maj_Etat_Signal(signalCplx,carre) // mettre un carré} +else +begin + if ( (MemZone[528,518] and (aiguillage[19].position<>2)) or + (MemZone[528,537] and (aiguillage[19].position=2) and (aiguillage[22].position=2)) or + (MemZone[528,538] and (aiguillage[19].position=2) and (aiguillage[22].position<>2)) ) then + begin + if (testbit(EtatSignalCplx[signalCplx],carre)=FALSE) then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if ((aiguillage[19].position<>2) or (aiguillage[22].position<>2)) then // aiguilles locales déviées + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,rappel_30); + // si aiguilles distantes déviée ou signal distant rouge -> avertissement + a:=((aiguillage[19].position<>2) and ((aiguillage[1].position<>2) or testBit(EtatSignalCplx[260],semaphore) or testBit(EtatSignalCplx[260],carre))) ; + b:=((aiguillage[22].position<>2) and ((aiguillage[11].position<>2) or testBit(EtatSignalCplx[477],semaphore) or testBit(EtatSignalCplx[477],carre))) ; + if a or b then begin Maj_Etat_Signal(signalCplx,jaune);end + else + begin + // si signal suivant est jaune + a:=((aiguillage[19].position<>2) and testbit(EtatSignalCplx[260],jaune)) ; + b:=(((aiguillage[19].position=2) and (aiguillage[22].position=2)) and testBit(EtatSignalCplx[420],jaune)) ; + c:=(((aiguillage[19].position=2) and (aiguillage[22].position<>2)) and testBit(EtatSignalCplx[476],jaune)) ; + if (a or b or c) then begin Maj_Etat_Signal(signalCplx,jaune_cli);end; // si signal complexe suivant = jaune + end; + end + else + begin // aiguilles locales non déviées + EtatSignalCplx[signalCplx]:=0; // raz état du signal + a:=((aiguillage[19].position<>2) and (testBit(EtatSignalCplx[260],carre) or testBit(EtatSignalCplx[260],semaphore))) ; + b:=(((aiguillage[19].position=2) and (aiguillage[22].position=2)) and (testBit(EtatSignalCplx[420],carre) or testBit(EtatSignalCplx[434],semaphore))) ; + c:=(((aiguillage[19].position=2) and (aiguillage[22].position<>2)) and (testBit(EtatSignalCplx[476],carre) or testBit(EtatSignalCplx[476],semaphore))) ; + if (a or b or c) then // si signalCplx suivant au rouge + Maj_Etat_Signal(signalCplx,jaune) + else + begin + if aiguillage[11].position<>2 then // avant : 11 si aiguille suivante prise en pointe est déviée + begin + Maj_Etat_Signal(signalCplx,ral_30); // afficher ralentissement + end + else + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + a:=((aiguillage[19].position<>2) and testBit(EtatSignalCplx[260],jaune)) ; + b:=((aiguillage[19].position=2) and (aiguillage[22].position=2) and testBit(EtatSignalCplx[420],jaune) ) ; + c:=((aiguillage[19].position=2) and (aiguillage[22].position<>2) and testBit(EtatSignalCplx[476],jaune) ) ; + if (a or b or c) then // si signal suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; +end; + +// signal 358============================================================*/ + signalCplx:=358; + PresTrain:=MemZone[519,517] or MemZone[515,517] or MemZone[520,517] or MemZone[521,527] or MemZone[522,527] or + (MemZone[527,519] and (aiguillage[7].position=2)) or + (MemZone[526,515] and (aiguillage[9].position<>2)) or + (MemZone[527,520] and (aiguillage[7].position<>2) and (aiguillage[20].position<>2) and (aiguillage[12].position=2)) ; + if ((PresTrain=FALSE) or (aiguillage[18].position=2)) then Maj_Etat_Signal(signalCplx,carre) + else + begin + if MemZone[517,524] or MemZone[517,525] then + begin + if (testBit(EtatSignalCplx[signalCplx],carre)=FALSE) then // si train quite zone de détection du signal + Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if (aiguillage[11].position<>2) then // si aiguille locale déviée + begin + EtatSignalCplx[signalCplx]:=0; + Maj_Etat_Signal(signalCplx,rappel_30); // afficher rappel ralentissement + if testBit(EtatSignalCplx[218],semaphore) then // si signal suivant rouge + Maj_Etat_Signal(signalCplx,jaune); + if testBit(EtatSignalCplx[218],jaune) then // si signal suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli); + end + else + begin + EtatSignalCplx[signalCplx]:=0; + if testBit(EtatSignalCplx[274],semaphore) or testBit(EtatSignalCplx[274],carre) then // si signal suivant est jaune + Maj_Etat_Signal(signalCplx,jaune) + else + begin + if TestBit(EtatSignalCplx[274],jaune) then + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; + +// signal 392 ============================================================*/ +signalCplx:=392; +if MemZone[535,533] then // si train quite détection du signal + Maj_Etat_Signal(signalCplx,semaphore) +else + if testBit(EtatSignalCplx[448],carre) or testBit(EtatSignalCplx[448],semaphore) then Maj_Etat_Signal(signalCplx,jaune) + else + if testBit(EtatSignalCplx[448],ral_30) or testBit(EtatSignalCplx[448],jaune) then Maj_Etat_Signal(signalCplx,jaune_cli) + else + Maj_Etat_Signal(signalCplx,vert_cli); + + + +// signal 420 =================================================================== +// signal regroupant 3 voies à revoir +// numéro de la voie en fonction de le position de l'aiguillage +if (aiguillage[25].position=2) then num_voie:=1 else + if (aiguillage[27].position=2) then num_voie:=2 else num_voie:=3; +signalCplx:=420; + +PresTrain:=(num_voie<=2) and MemZone[527,520] and (aiguillage[7].position<>2); +PresTrain:=((num_voie=1) and MemZone[520,529]) or PresTrain; +PresTrain:=((num_voie=2) and MemZone[520,530]) or PresTrain; +PresTrain:=((MemZone[521,527] or MemZone[522,527]) and (aiguillage[7].position<>2)) or PresTrain; +PresTrain:=((num_voie=3) and (MemZone[513,537] or (MemZone[526,513] and (aiguillage[10].position=2) and (aiguillage[19].position=2) and (aiguillage[22].position=2)) or MemZone[528,537] or MemZone[524,537])) or PresTrain; + +//if (((Mem_520_529) &&(num_voie!=1)) || ((Mem_520_530) && (num_voie!=2)) || +// ((Mem_528_537 || Mem_513_537 || Mem_524_537) &&(num_voie!=3)) +// && (aiguillage[31]!=0) || +if (PresTrain=FALSE) then Maj_Etat_Signal(signalCplx,carre) +else +begin + if ( ((num_voie=1) and MemZone[529,534]) or + ((num_voie=2) and MemZone[530,534]) or + ((num_voie=3) and MemZone[537,534]) ) then + begin + if TestBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if testBit(EtatSignalCplx[406],semaphore) or testBit(EtatSignalCplx[406],carre) then // si signal cplx suivant est rouge Maj_Etat_Signal(signalCplx,jaune); + else + begin + if aiguillage[11].position<>2 then // si aiguille suivante est déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30) ; + end + else + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if testBit(EtatSignalCplx[406],jaune_F) or testBit(EtatSignalCplx[406],ral_60_F) then //si signal cplx suivant est jaune ou ralentissement----------- Maj_Etat_Signal(signalCplx,jaune_cli); + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; +end; + + +// signal 448 =================================================================== + signalCplx:=448; + PresTrain:=(MemZone[517,525] and (aiguillage[17].position=2)) or MemZone[525,535] or MemZone[535,533]; + if (aiguillage[24].position=2) or (PresTrain=FALSE) then Maj_Etat_Signal(signalCplx,carre) + else + begin + if MemZone[533,538] then //si train quitte zone de détection du signal + begin + if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if testBit(EtatSignalCplx[476],carre) or testBit(EtatSignalCplx[476],semaphore) then // si signal suivant rouge + begin + Maj_Etat_Signal(signalCplx,jaune); + end + else + begin + if (aiguillage[11].position<>2) then // si aiguille suivante prise en pointe est déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30); // afficher ralentissement + end + else + begin // cas si aiguille suivante prise en pointe pas déviée + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if testBit(EtatSignalCplx[476],jaune) then //si signal suivant est jaune----------- + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; +end; + +// signal 462 ============================================================*/ +signalCplx:=462; +PresTrain:=MemZone[526,513] or ((MemZone[523,526] or MemZone[518,523]) and (aiguillage[9].position=2)) ; +// si aiguillages pris en talon mal positionnés ou pas de train avant signal +if (aiguillage[10].position<>2) or (aiguillage[29].position<>2) or (PresTrain=FALSE) then + Maj_Etat_Signal(signalCplx,carre) // mettre un carré} +else +begin + // si présence train après le signal (3 directions à tester) et signal <> carré + if ( MemZone[513,518] and (aiguillage[19].position<>2)) or + ( MemZone[513,537] and (aiguillage[19].position=2) and (aiguillage[22].position=2)) or + ( MemZone[513,538] and (aiguillage[19].position=2) and (aiguillage[22].position<>2)) then + begin + if TestBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if (aiguillage[19].position<>0) or (aiguillage[22].position<>2) then // si aiguilles locales déviées + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,rappel_30); + // si aiguilles distantes déviées ou signal distant rouge -> avertissement + a:=(aiguillage[19].position<>2) and ((aiguillage[1].position<>2) or testBit(EtatSignalCplx[260],semaphore) or testBit(EtatSignalCplx[260],carre)); + b:=(aiguillage[22].position<>2) and ((aiguillage[11].position<>2) or testBit(EtatSignalCplx[477],semaphore) or testBit(EtatSignalCplx[477],carre)); + if (a or b) then + Maj_Etat_Signal(signalCplx,jaune) + else + begin // si signal distant est jaune + a:=((aiguillage[19].position<>2) and testBit(EtatSignalCplx[260],jaune)) ; + b:=(((aiguillage[19].position=2) and (aiguillage[22].position=2)) and testbit(EtatSignalCplx[420],jaune)) ; + c:=(((aiguillage[19].position=2) and (aiguillage[22].position<>2)) and testbit(EtatSignalCplx[476],jaune)) ; + if (a or b or c) then Maj_Etat_Signal(signalCplx,jaune_cli); // si signal complexe suivant = jaune + end; + end + else + begin // aiguilles locales en position droite + EtatSignalCplx[signalCplx]:=0; // raz état du signal + a:=((aiguillage[19].position<>0) and testBit(EtatSignalCplx[260],carre) or TestBit(EtatSignalCplx[260],semaphore)) ; + b:=(((aiguillage[19].position<>0) and (aiguillage[22].position=2)) and TestBit(EtatSignalCplx[420],carre) or TestBit(EtatSignalCplx[434],semaphore)) ; + c:=(((aiguillage[19].position=2) and (aiguillage[22].position<>0)) and testbit(EtatSignalCplx[476],carre) or TestBit(EtatSignalCplx[476],semaphore)) ; + if (a or b or c) then // si signalCplx suivant au rouge + Maj_Etat_Signal(signalCplx,jaune) + else + begin + // aiguilles locales en position droite + if (aiguillage[11].position<>2) then // si aiguille suivante prise en pointe est déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30); // afficher ralentissement + end + else + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + a:=((aiguillage[19].position<>2) and TestBit(EtatSignalCplx[260],jaune)) ; + b:=((aiguillage[19].position=2) and (aiguillage[22].position=2) and TestBit(EtatSignalCplx[420],jaune) ) ; + c:=((aiguillage[19].position=2) and (aiguillage[22].position<>2) and TestBit(EtatSignalCplx[476],jaune) ) ; + if (a or b or c) then // si signal CDM suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; +end; + +// signal 476 ============================================================*/ + signalCplx:=476; + PresTrain:=MemZone[533,538] or MemZone[535,533] or MemZone[525,535]; + PresTrain:=MemZone[528,538] or MemZone[513,538] or MemZone[524,538] or PresTrain; + + if ((((aiguillage[23].position<>2) or (aiguillage[18].position<>2)) or + ((aiguillage[30].position<>2) or (aiguillage[11].position=2) or (aiguillage[23].position=2)) ) or (PresTrain=FALSE)) then Maj_Etat_Signal(signalCplx,carre) + else + begin + if MemZone[538,524] or MemZone[538,525] then //si train quitte signal + begin + if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if (aiguillage[11].position<>2) then // si aiguille locale déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état complet + Maj_Etat_Signal(signalCplx,rappel_30); // afficher rappel ralentissement + if testBit(EtatSignalCplx[218],semaphore) then // si signal suivant rouge + Maj_Etat_Signal(signalCplx,jaune) + else + begin + if testbit(EtatSignalCplx[218],jaune) or testBit(EtatSignalCplx[218],ral_30) then // si signal suivant est jaune ou ral30 begin Maj_Etat_Signal(signalCplx,jaune_cli);end; + end; + end + else + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if testbit(EtatSignalCplx[274],jaune) then // si signal suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end ; + + // signal 497 ============================================================*/ + signalCplx:=497; + //memZone[523,518]:=true; + PresTrain:=MemZone[518,531] or MemZone[523,518] or MemZone[515,518] or MemZone[514,518] or + MemZone[526,523]; + //PresTrain:=true; + //if PresTrain then Affiche('prestrain',clorange); + // équations aiguillages mal positionnés + if ((aiguillage[19].position<>1) or // 1 = dévié + ((aiguillage[19].position=1) and (aiguillage[10].position=2) and (aiguillage[29].position=1) and (aiguillage[30].position<>1)) or + (PresTrain=FALSE)) then + Maj_Etat_Signal(signalCplx,carre) + else + begin + if MemZone[531,528] or MemZone[531,528] or MemZone[531,513] or MemZone[531,524] then //si train quitte signal + begin + if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if (aiguillage[10].position<>2) then // si aiguille locale déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état complet + Maj_Etat_Signal(signalCplx,rappel_30); // afficher rappel ralentissement + //if testBit(EtatSignalCplx[xx],semaphore) then // si signal suivant rouge + // Maj_Etat_Signal(signalCplx,jaune) + //else + //begin + // if testbit(EtatSignalCplx[218],jaune) or testBit(EtatSignalCplx[218],ral_30) then // si signal suivant est jaune ou ral30 // begin Maj_Etat_Signal(signalCplx,jaune_cli);end; + //end; + end + else + if (aiguillage[29].position<>2) then + begin + EtatSignalCplx[signalCplx]:=0; // raz état complet + Maj_Etat_Signal(signalCplx,rappel_60); // afficher rappel ralentissement + if testBit(EtatSignalCplx[274],semaphore) then // si signal suivant rouge + Maj_Etat_Signal(signalCplx,jaune) + else if testbit(EtatSignalCplx[274],jaune) then // si signal suivant est jaune ou ral30 + begin Maj_Etat_Signal(signalCplx,jaune_cli);end; + end + else + begin // aiguilles locales non déviées + //EtatSignalCplx[xx]:=0; // raz état du signal + //if testbit(EtatSignalCplx[xx],jaune) then // si signal suivant est jaune + // Maj_Etat_Signal(signalCplx,jaune_cli) + //else + Maj_Etat_Signal(signalCplx,vert); + end; + end; + end ; + + +// signal 600 =====================================================*/ +signalCplx:=600; +PresTrain:=MemZone[524,521] or MemZone[517,524] or MemZone[538,524] or MemZone[534,524]; + +//if ((aiguillage[8].position<>2) or (PresTrain=FALSE)) then Maj_Etat_Signal(signalCplx,carre) +//else + begin + if MemZone[521,527] then + begin + if (testBit(EtatSignalCplx[signalCplx],carre)=FALSE) then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if testBit(EtatSignalCplx[204],semaphore) or testBit(EtatSignalCplx[204],carre) then // si signal cplx suivant est rouge + Maj_Etat_Signal(signalCplx,jaune) + else + begin + if (aiguillage[7].position<>2) then// si aiguille suivante est déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30) ; + end + else + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if TestBit(EtatSignalCplx[204],jaune) or testBit(EtatSignalCplx[204],ral_60) then //si signal cplx suivant est jaune ou ralentissement----------- + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; + +end; // de la procédure pilote signaux + + +// pilotage des signaux +procedure envoi_signauxCplx; +var i,signalCplx : integer; +begin + //Affiche('Envoi des signaux (envoi_signaixCplx)',ClGreen); + //chaque signal doit être appellé en fonction de sa procédure suivant le décodeur + for i:=1 to NbreFeux do + begin + signalCplx:=feux[i].adresse; + if not(ferme) and (signalCplx<>0) then + begin + case feux[i].decodeur of + 0 : envoi_virtuel(signalCplx); + 1 : envoi_signalBahn(signalCplx); + 2 : envoi_CDF(signalCplx); + 3 : envoi_LDT(signalCplx); + 4 : envoi_LEB(signalCplx); + //5 : envoi_NMRA(SignalCplx); + end; + end; + end; +end; + +function virgule_suiv(sl : string;o : integer) : integer; +var k : integer; +begin + o:=o+1; + for k:=o to length(sl) do + begin + // Affiche(sl[k],clGreen); + if sl[k]=',' then begin result:=k;exit;end; + end; + result:=0; +end; + + +// trouve l'enregistrement suivant après l'offset dans une branche +// en sortie : trouve_enregistrement= nouvel offset, enregistrement +// si 0 en sortie: fin de ligne +function trouve_enregistrement_suiv(num_branche : integer;offset : integer) : integer; +var j : integer; + ss : string; +begin + //Affiche(branche[num_branche],clWhite); + j:=virgule_suiv(branche[Num_Branche],offset); // pointe sur la virgule suivante + //Affiche('virgule suivante j='+IntToStr(j),ClOrange); + //Affiche(' j='+IntToStr(j),ClOrange); + if j<>0 then ss:=copy(branche[Num_Branche],offset,j-offset) // champ suivant + else ss:=copy(branche[Num_Branche],offset,length(branche[Num_Branche])-offset+1); // si j=0 c'est la fin de la chaîne + //affiche(ss,clGreen); + enregistrement:=ss; + if j=0 then result:=0 else result:=j+1; +end; + +// trouve l'index d'un détecteur dans une branche +// si pas trouvé, renvoie 0 +function index_detecteur(det,Num_branche : integer) : integer; +var i,adr : integer; + trouve : boolean; + procedure recherche; + begin + repeat + adr:=BrancheN[Num_Branche,i].adresse; + trouve:=(det=adr) and ((BrancheN[Num_Branche,i].Btype=1) or (BrancheN[Num_branche,i].BType=4)); // cherche un détecteur + //Affiche('cherche='+intToSTR(det)+'/explore='+intToSTR(adr)+' Branche='+intToStr(Num_branche)+' index='+intToStr(i),ClWhite); + if not(trouve) then inc(i); + //if trouve then Affiche('Trouvé en branche'+IntToSTR(Num_branche)+' index='+IntToSTR(i),clGreen); + until trouve or (adr=0) ; + end; +begin + i:=1;index2_det:=0; + recherche; + if trouve then result:=i else result:=0; + //affiche(inttostr(ai+1),clOrange); + i:=2; // à voir + //affiche('------------------------',clWhite); + recherche; + //affiche('------------------------',clGreen); + if trouve then index2_det:=i else index2_det:=0; + //affiche('index2='+IntToSTR(index2_det),clWhite); +end; + + +// si pas trouvé, IndexBranche_trouve=0 +procedure trouve_detecteur(detecteur : integer); +var NBranche,i : integer; +begin + Nbranche:=1; + i:=1; + repeat + i:=index_detecteur(detecteur,Nbranche); + if i=0 then inc(NBranche); + until (Nbranche>NbreBranches) or (i<>0); + // if (i<>0) and traceDet then Affiche('Détecteur trouvé en branche '+intToSTR(NBranche)+' index='+IntToSTR(i),clYellow); + branche_trouve:=NBranche; + IndexBranche_trouve:=i; +end; + + +procedure lit_config; +var s,sa,chaine,SOrigine: string; + c,paig : char; + tec,bistec,tjd,tjs,s2,trouve,triple,debugConfig,multiple,fini,finifeux : boolean; + bd,virgule,i_detect,i,erreur,aig,detect,offset,index, adresse,j,position,temporisation,invers,indexPointe,indexDevie,indexDroit, + ComptEl,Compt_IT,Num_Element,k,modele,aig2,adr,erreur2,l : integer; + function lit_ligne : string ; + begin + repeat + readln(fichier,s); + s:=uppercase(s); + //Affiche(s,clWhite); + if length(s)>0 then c:=s[1]; + until ((c<>'/') and (s<>'')) or eof(fichier) ; + lit_ligne:=s; + end; +begin + debugConfig:=false; + // 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].temps:=5 ; + Aiguillage[i].inversion:=0; + end; + for i:=1 to 1024 do + begin + Detecteur[i]:=false; + Ancien_detecteur[i]:=false; + end; + //ChDir(s); + Affiche('lecture du fichier de configuration client-GL.cfg',clyellow); + assign(fichier,'client-GL.cfg'); + reset(fichier); + {lecture du fichier de configuration} + // taille de fonte + s:=lit_ligne; + i:=StrToINT(s); + with FormPrinc.ListBox1 do + begin + Font.Height:=i; + ItemHeight:=i+1; + end; + // adresse ip et port de CDM + // AfficheDet:=true; + s:=lit_ligne; + i:=pos(':',s); + if i<>0 then begin adresseIPCDM:=copy(s,1,i-1);Delete(s,1,i);portCDM:=StrToINT(s);end; + + + // adresse ip et port de la centrale + // AfficheDet:=true; + s:=lit_ligne; + i:=pos(':',s); + if i<>0 then begin adresseIP:=copy(s,1,i-1);Delete(s,1,i);port:=StrToINT(s);parSocket:=True;end + else begin adresseIP:='0';parSocket:=false;end; + + // numéro de port + s:=lit_ligne; + NumPort:=StrToINT(s); + + //avec ou sans initialisation des aiguillages + s:=lit_ligne; + AvecInitAiguillages:=StrToINT(s); + + Affiche('Valeurs d''initialisation des aiguillages',clyellow); + //initialisation aiguillages + repeat + s:=lit_ligne; + j:=pos(',',s); + if j>1 then + begin + adresse:=StrToINT(copy(s,1,j-1));Delete(s,1,j); // adresse aiguillage + if (adresse>0) then + begin + j:=pos(',',s); + position:=StrToInt(copy(s,1,j-1));Delete(S,1,j);// position aiguillage + if (position<1) or (position>2) then position:=1; + aiguillage[adresse].position:=position; + aiguillageB[adresse].position:=position; + + // temporisation aiguillage + j:=pos(',',s); + temporisation:=StrToInt(copy(s,1,j-1));Delete(S,1,j); + if (temporisation<0) or (temporisation>10) then temporisation:=5; + aiguillage[adresse].temps:=temporisation; + aiguillageB[adresse].temps:=temporisation; + + invers:=StrToInt(s); + if (invers<0) or (invers>1) then invers:=0; // inversion commande + aiguillage[adresse].inversion:=invers; + aiguillageB[adresse].inversion:=invers; + + end; + end; + until (adresse=0); + + + + + closefile(fichier); + + + Affiche('lecture du fichier de configuration config.cfg',clyellow); + assign(fichier,'config.cfg'); + reset(fichier); + + s:=Lit_ligne; //variable log non utilisée + s:=Lit_ligne; // trace_det + s:=Lit_ligne; // raz signaux + + + + Affiche('Définition des aiguillages',clyellow); + + // définition des aiguillages dans les branches + maxaiguillage:=0; + repeat + s:=lit_ligne;sOrigine:=s; + //chaine:=s; + if debugconfig then Affiche(s,ClLime); + if (s<>'0') then + begin + virgule:=pos(',',s); + enregistrement:=copy(s,1,virgule-1); // adresse de l'aiguillage [TRI] + delete(s,1,virgule); + triple:=pos('TRI',enregistrement)<>0; + bis:=pos('B',enregistrement)<>0; + tjd:=pos('TJD',enregistrement)<>0; + tjs:=pos('TJS',enregistrement)<>0; + // adresse de l'aiguillage + Val(enregistrement,aig,erreur); // aig = adresse de l'aiguillage + if aig>maxaiguillage then maxaiguillage:=aig; + if debugConfig then Affiche('Adresse='+IntToSTR(aig)+' enregistrement='+Enregistrement,clyellow); + + if not(bis) then begin aiguillage[aig].AdroitB:='Z'; aiguillage[aig].AdevieB:='Z'; aiguillage[aig].ApointeB:='Z'; aiguillage[aig].Adevie2B:='Z';end + else begin aiguillageB[aig].AdroitB:='Z';aiguillageB[aig].AdevieB:='Z';aiguillageB[aig].ApointeB:='Z';aiguillageB[aig].Adevie2B:='Z';end ; + + if (triple) then aiguillage[aig].modele:=4; + if (tjs) then + begin + if not(bis) then aiguillage[aig].modele:=3 + else aiguillageB[aig].modele:=3; + end; + if (tjd) then + begin + if not(bis) then aiguillage[aig].modele:=2 + else aiguillageB[aig].modele:=2; + end; + if not(tjs) and not(tjd) and not(triple) then + begin + if not(bis) then aiguillage[aig].modele:=1 + else aiguillageB[aig].modele:=1; + end; + //if debugConfig then Affiche(s,clyellow); + + if (triple) then + begin + Val(s,aig2,erreur); // aig = 2eme adresse de l'aiguillage + aiguillage[aig].AdrTriple:=aig2; + virgule:=pos(',',s); + delete(s,1,virgule); + end; + ComptEl:=0;Compt_It:=0;Num_element:=Num_element+1; + // préparer l'enregistrement pour la boucle de ligne + virgule:=pos(',',s); + enregistrement:=copy(s,1,virgule-1); + delete(s,1,virgule); + + repeat // parcoure la ligne + if (debugConfig) then Affiche('boucle de ligne: '+s,clYellow); + + if (length(enregistrement)<>0) then + if (enregistrement[1]='P') then + begin + if debugconfig then Affiche('Section P - enregistrement='+enregistrement,clYellow); + ComptEl:=ComptEl+1; + delete(enregistrement,1,1); // supprime le P + detect:=0; + Val(enregistrement,detect,erreur); + if erreur<>0 then delete(enregistrement,1,erreur-1); + //if ((aig=0) and (erreur=0)) then Affiche('Erreur pas d''adresse dans section P: '+chaine,clRed); + if (erreur=0) then enregistrement:=copy(s,1,virgule-1); + if not(bis) then aiguillage[aig].Apointe:=detect else aiguillageB[aig].Apointe:=detect; + if (erreur<>0) then // si erreur<>0 peut être un B ou un S ou un , + begin + if (enregistrement[1]='B') then + begin + if not(bis) then aiguillage[aig].ApointeBis:=1 else aiguillageB[aig].ApointeBis:=1; + delete(enregistrement,1,1); + if (debugConfig) then affiche('connecté a aiguillage BIS'+s,clYellow); + end; + if not(bis) then aiguillage[aig].ApointeB:=enregistrement[1] else aiguillageB[aig].ApointeB:=enregistrement[1]; + delete(enregistrement,1,1); + Num_element:=Num_element+1; + end; + virgule:=pos(',',s);if virgule=0 then virgule:=length(s)+1; + enregistrement:=copy(s,1,virgule-1); + delete(s,1,virgule); + end; + + if (length(enregistrement)<>0) then // section droite + if (enregistrement[1]='D') then + begin + if debugconfig then Affiche('Section D - enregistrement='+enregistrement,clYellow); + ComptEl:=ComptEl+1; + delete(enregistrement,1,1); // supprime le P + detect:=0; + Val(enregistrement,detect,erreur); + if erreur<>0 then delete(enregistrement,1,erreur-1); + if debugconfig then Affiche(enregistrement,clyellow); + //if ((aig=0) and (erreur=0)) then Affiche('Erreur pas d''adresse dans section D: '+chaine,clRed); + if (erreur=0) then enregistrement:=''; + if not(bis) then aiguillage[aig].Adroit:=detect else aiguillageB[aig].Adroit:=detect; + if (erreur<>0) then // si erreur<>0 peut être un B ou un S ou un , + begin + if (enregistrement[1]='B') then + begin + if not(bis) then aiguillage[aig].AdroitBis:=1 else aiguillageB[aig].AdroitBis:=1; + delete(enregistrement,1,1); + if (debugConfig) then affiche('connecté a aiguillage BIS'+s,clYellow); + end; + if (enregistrement[1]<>',') then // copier si c'est S P D + begin + if not(bis) then aiguillage[aig].AdroitB:=enregistrement[1] else aiguillageB[aig].AdroitB:=enregistrement[1]; + delete(enregistrement,1,1); + if (debugConfig) then affiche('connecté a aiguillage BIS'+s,clYellow); + end; + delete(enregistrement,1,1); + Num_element:=Num_element+1; + end; + virgule:=pos(',',s);if virgule=0 then virgule:=length(s)+1; + enregistrement:=copy(s,1,virgule-1); + delete(s,1,virgule); + end; + + if (length(enregistrement)<>0) then + if (enregistrement[1]='S') then + begin + if debugconfig then Affiche('Section S - enregistrement='+enregistrement,clYellow); + ComptEl:=ComptEl+1; + delete(enregistrement,1,1); // supprime le S + erreur:=pos('2-',enregistrement); + S2:=erreur<>0; + if (S2) then delete(enregistrement,erreur,2); + + erreur:=pos('S2',enregistrement); // description d'un rattachement à mla branche S2 d'un aiguillage triple + tec:=erreur<>0; // ne supprimer que le 2 + if (tec) then delete(enregistrement,erreur+1,1); + + erreur:=pos('B',enregistrement); // description d'un rattachement connecté à un aiguillage bis + bistec:=erreur<>0; + if (bistec) then delete(enregistrement,erreur,1); // ne supprime que le B + detect:=0; + val(enregistrement,detect,erreur); // extraction de l'adresse + //if ((detect=0) and (erreur=0)) then Affiche('Erreur pas d''adresse dans section S: '+s,clred); + c:='Z'; + if (erreur<>0) then begin delete(enregistrement,1,erreur-1);c:=enregistrement[1];end; + + if not(bis) and not(bistec) and not(S2) and not(tec) then begin aiguillage[aig].Adevie:=detect;aiguillage[aig].AdevieB:=c;end; + if not(bis) and not(bistec) and S2 and not(tec) then begin aiguillage[aig].Adevie2:=detect;aiguillage[aig].Adevie2B:=c;end; + if not(bis) and not(bistec) and S2 and tec then begin aiguillage[aig].Adevie2:=detect;aiguillage[aig].Adevie2B:='T';end; + if not(bis) and (bistec) and not(S2) and not(tec) then begin aiguillage[aig].Adevie:=detect;aiguillage[aig].AdevieBis:=1;aiguillage[aig].AdevieB:=c;end; + virgule:=pos(',',s);if virgule=0 then virgule:=length(s)+1; + enregistrement:=copy(s,1,virgule-1); + delete(s,1,virgule); + end; + + Val(enregistrement,adr,erreur); + if erreur=0 then + begin + aiguillage[aig].vitesse:=adr; + enregistrement:=''; + end; + + until enregistrement='' ; + end; + until (s='0'); + + Affiche('définition des branches',clyellow); + // branches de réseau + NDetecteurs:=0; + i:=1;i_detect:=1; + repeat + s:=lit_ligne; + //Affiche(s,clWhite); + //adresse:=pos('0',s); + //s:='A16B,557,0' ; + if s<>'0' then + begin + branche[i]:=s; + j:=1;offset:=1; + repeat + BrancheN[i,j].adresse:=0; // préparer le suivant à 0 + offset:=trouve_enregistrement_suiv(i,offset) ; + // décoder l'enregistrement + // si c'est un détecteur, fini trouvé + //affiche(enregistrement,clred); + Val(enregistrement,detect,erreur); // détermine si le champ est numérique ou pas (cad si aiguillage) + //Affiche(enregistrement+'detect='+intToSTR(detect),clyellow); + + // il y a un aiguillage ou un espace après le champ....en fin de ligne + if erreur<>0 then + begin + c:=enregistrement[1]; + delete(enregistrement,1,1); + if c='A' then + begin + Val(enregistrement,adresse,erreur2); + //Affiche(IntToSTR(adresse),clyellow); + BrancheN[i,j].adresse:=adresse; + k:=pos('B',enregistrement); + if k=0 then BrancheN[i,j].btype:=2 else BrancheN[i,j].btype:=3; // ident aiguillage + end + else erreur:=0; // forcer erreur à 0 pour obliger à passer sur un détecteur + end; + + // détecteur + if erreur=0 then + begin + //Affiche(IntToSTR(detect),clyellow); + //Affiche(s,clorange); Affiche(IntToStr(detect),clorange); + BrancheN[i,j].adresse:=detect; // adresse + BrancheN[i,j].btype:=1;// ident détecteur + if detect=0 then begin BrancheN[i,j].btype:=4;end; // buttoir + //if j=1 then Affiche('Erreur la ligne doit commencer par un aiguillage: '+s,clred); + //if (offset=-1) then Affiche('Erreur la ligne soit se terminer par un aiguillage:'+s,clred); + // vérifier si le détecteur est déja stocké + bd:=0; + repeat + inc(bd); + trouve:=Adresse_detecteur[bd]=detect; + until ((bd=NDetecteurs+1) or trouve) ; + if not(trouve) then + begin + Adresse_detecteur[bd]:=detect; + NDetecteurs:=bd; + end; + end; + inc(j); + BrancheN[i,j].adresse:=0; // préparer le suivant à 0 + //Affiche('branche '+intToSTR(i)+' index='+intToStr(j),clGreen); + until (offset=0); + inc(i); + end; + until (s='0'); + NbreBranches:=i-1; + //Affiche(IntToSTR(NbreBranches)+' branches',clYellow); + + // feux + Affiche('Définition des feux',clyellow); + i:=1; + repeat + s:=lit_ligne; + //Affiche(s,clYellow); + finifeux:=s[1]='0'; + if not(finifeux) then + begin + chaine:=s; + j:=pos(',',s); + if j>1 then + begin + + adresse:=StrToINT(copy(s,1,j-1));Delete(s,1,j); // adresse de feu + //if (adresse0) then adresse:=1000; + feux[i].adresse:=adresse; + j:=pos(',',s); + if j>1 then begin feux[i].aspect:=StrToInt(copy(s,1,j-1));Delete(s,1,j);end; + j:=pos(',',s); + if j>1 then begin Feux[i].FeuBlanc:=(copy(s,1,j-1))='1';delete(s,1,j);end; + j:=pos(',',s); + if j=0 then begin Feux[i].decodeur:=StrToInt(s);end else begin Feux[i].decodeur:=StrToInt(copy(s,1,j-1));delete(s,1,j);end; + feux[i].Adr_el_suiv1:=0;feux[i].Adr_el_suiv2:=0;feux[i].Adr_el_suiv3:=0;feux[i].Adr_el_suiv4:=0; + feux[i].Btype_Suiv1:=0;feux[i].Btype_Suiv2:=0;feux[i].Btype_Suiv3:=0;feux[i].Btype_Suiv4:=0; + feux[i].Adr_det1:=0;feux[i].Adr_det2:=0;feux[i].Adr_det3:=0;feux[i].Adr_det4:=0; + // éléments optionnels + if j<>0 then + begin + //Affiche('Entrée:s='+s,clyellow); + sa:=s; + multiple:=s[1]='('; + if multiple then + begin + delete(s,1,1); + j:=0; + repeat + k:=pos(',',s); + if k>1 then + begin + val(s,adr,erreur); // extraire l'adresse + Delete(s,1,k); + end; + + //Affiche('Adr='+IntToSTR(adr)+' ' +intToSTR(erreur),clyellow); + //Affiche('S avec premier champ supprimé='+s,clyellow); + inc(j); + if (j=1) then feux[i].Adr_det1:=adr; + if (j=2) then feux[i].Adr_det2:=adr; + if (j=3) then feux[i].Adr_det3:=adr; + if (j=4) then feux[i].Adr_det4:=adr; + //type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri 5=bis + if s[1]='A' then + begin + //Affiche('détecté aiguillage',clyellow); + if (j=1) then feux[i].Btype_Suiv1:=2; + if (j=2) then feux[i].Btype_Suiv2:=2; + if (j=3) then feux[i].Btype_Suiv3:=2; + if (j=4) then feux[i].Btype_Suiv4:=2; + delete(s,1,1); + end; + l:=pos('TRI',s); + if l<>0 then + begin + delete(s,l,3); + //Affiche('détecté aiguillage tri',clyellow); + if (j=1) then feux[i].Btype_Suiv1:=4; + if (j=2) then feux[i].Btype_Suiv2:=4; + if (j=3) then feux[i].Btype_Suiv3:=4; + if (j=4) then feux[i].Btype_Suiv4:=4; + end; + l:=pos('B',s); + if l<>0 then + begin + delete(s,l,1); + //Affiche('détecté aiguillage bis',clyellow); + if (j=1) then feux[i].Btype_Suiv1:=5; + if (j=2) then feux[i].Btype_Suiv2:=5; + if (j=3) then feux[i].Btype_Suiv3:=5; + if (j=4) then feux[i].Btype_Suiv4:=5; + end; + Val(s,adr,erreur); + //Affiche('Adr='+IntToSTR(Adr),clyellow); + if (j=1) then feux[i].Adr_el_suiv1:=Adr; + if (j=2) then feux[i].Adr_el_suiv2:=Adr; + if (j=3) then feux[i].Adr_el_suiv3:=Adr; + if (j=4) then feux[i].Adr_el_suiv4:=Adr; + delete(s,1,erreur-1); + if s[1]=',' then delete(s,1,1); + //Affiche('S en fin de traitement s='+s,clyellow); + fini:=s[1]=')'; + until (fini) or (j>4); + //if fini then Affiche('fini',clyellow); + end; + if (j>4) or (not(multiple)) then begin Affiche('Erreur: fichier de configuration ligne erronnée : '+chaine,clred); closefile(fichier);exit;end; + + k:=pos(',',s); + delete(s,1,k); + //Affiche('s='+s,clyellow); + feux[i].VerrouCarre:=s[1]='1'; + end; + inc(i); + end; + end; + until (finifeux); + NbreFeux:=i-1; if NbreFeux<0 then NbreFeux:=0; + //Affiche('Nombre de feux='+IntToSTR(NbreFeux),clYellow); + + //Affiche(IntToStr(NbreBranches)+' branches',clwhite); + closefile(fichier); + // vérification de la cohérence1 + // parcoure les branches des détecteurs jusqu'à trouver un aiguillage pour voir s'il a été décrit + for i:=1 to NbreBranches do + begin + j:=1; + repeat + detect:=BrancheN[i][j].Adresse; + modele:=BrancheN[i][j].BType; //1= détecteur 2 ou 3 aiguillage + j:=j+1; + until ( (modele=1) or (modele=2) or (modele=3) or ((modele=0) and (detect=0))); + // trouvé un aiguillage et récupéré son adresse dans detect + //if (type!=1) Display("Erreur aucun détecteur dans la déclaration du réseau\r\n"); + if (modele=1) or (modele=2) or (modele=3) then + begin + modele:=aiguillage[detect].modele; + if (modele=0) then Affiche('Erreur 1: Aiguillage='+intToStr(detect)+' non décrit mais présent dans la description des branches '+intToStr(i)+'/'+intToSTR(j),clred); + end; + end; + + // vérification de la cohérence2 + // parcoure les aiguillages pour voir si les détecteurs sont en branches des détecteurs + for aig:=1 to maxaiguillage do + begin + adr:=aiguillage[aig].Adroit; + if (aiguillage[aig].AdroitB='Z') then + begin + trouve_detecteur(adr); // branche_trouve IndexBranche_trouve + if (IndexBranche_trouve=0) then + Affiche('Erreur 2: détecteur '+intToSTR(adr)+' décrit dans l''aiguillage '+intToSTR(aig)+' mais absent dans la description des branches',clred); + end; + adr:=aiguillage[aig].Adevie; + if (aiguillage[aig].AdevieB='Z') then + begin + trouve_detecteur(adr); // branche_trouve IndexBranche_trouve + if (IndexBranche_trouve=0) then + Affiche('Erreur 3: détecteur '+intToSTR(adr)+' décrit dans l''aiguillage '+intToSTR(aig)+' mais absent dans la description des branches',clRed); + end; + adr:=aiguillage[aig].Apointe; + if ((aiguillage[aig].ApointeB='Z') and (aiguillage[aig].modele=1)) then + begin + trouve_detecteur(adr); // branche_trouve IndexBranche_trouve + if (IndexBranche_trouve=0) then + Affiche('Erreur 4 : détecteur '+intToSTR(adr)+' décrit dans l''aiguillage '+intToSTR(aig)+' mais absent dans la description des branches',clRed); + end; + if (aiguillage[aig].modele=4) then // aiguillage triple + begin + if (aiguillage[aig].Adevie2B='Z') then + begin + adr:=aiguillage[aig].Adevie2; + trouve_detecteur(adr); // branche_trouve IndexBranche_trouve + if (IndexBranche_trouve=0) then + Affiche('Erreur 5 : détecteur '+intToSTR(adr)+' décrit dans l''aiguillage '+intToSTR(aig)+' mais absent dans la description des branches',clRed); + end; + end; + end; +end; + +// front descendant sur un détecteur +function detecteur_0(adresse : integer) : boolean; +var res : boolean; +begin + detecteur_0:=(Ancien_detecteur[adresse]=true) and ((detecteur[adresse])=false); + Ancien_detecteur[adresse]:=detecteur[adresse]; +end; + +function detecteur_1(adresse : integer) : boolean; +var fd : boolean; +begin + detecteur_1:=(Ancien_detecteur[adresse]=false) and ((detecteur[adresse])=true); + Ancien_detecteur[adresse]:=detecteur[adresse]; +end; + +function virgule_prec(sl : string;o : integer) : integer; +var k : integer; +begin + o:=o-1; + for k:=o downto 1 do + begin + //Affiche(intToSTR(k)+'/'+sl[k],clGreen); + if sl[k]=',' then begin result:=k;exit;end; + end; + result:=0; +end; + +// trouve un élément dans les branches, renvoie branche_trouve IndexBranche_trouve +procedure trouve_element(el : integer;sibis : boolean); +var i,Btype,adr,Branche : integer ; + s : string; + sort : boolean; +begin + Branche:=1; + branche_trouve:=0; + IndexBranche_trouve:=0; + i:=1; + repeat + adr:=BrancheN[Branche,i].Adresse; + Btype:=BrancheN[Branche,i].BType; + if ((adr=0) and (Btype=0)) then begin inc(Branche);i:=0;end; + inc(i); + sort:=(Branche>NbreBranches) or + ((adr=el) and sibis and (Btype=3)) or + ((adr=el) and not(sibis) and (Btype=2)) or + ((adr=el) and not(sibis) and (Btype=1)) ; + until (sort); + if (adr=el) then + begin + branche_trouve:=Branche; + IndexBranche_trouve:=i-1; + end + else begin s:='Erreur 175 - élément '+intToSTR(el); + if (sibis) then s:=s+'bis'; + s:=s+' non trouvé';Affiche(s,clred); + branche_trouve:=0; IndexBranche_trouve:=0; + if NivDebug>=1 then AfficheDebug(s,clred); + end; +end; + + + +// renvoie élément suivant entre deux éléments quels qu'ils soient mais contigus +// et en variables globales: bis si c'est un aiguillage bis +// s'ils ne sont pas contigus, on aura une erreur +// alg= algorithme : +// 1=arret sur suivant qu'il soit un détecteur ou un aiguillage +// 2=arret sur aiguillage en talon mal positionné +// 3=arret sur un aiguillage pris en pointe dévié et AdrDevie contient l'adresse de l'aiguillage dévié ainsi que Bis +// code de sortie : élément suivant ou: +// 9999=erreur fatale +// 9998= arret sur aiguillage en talon mal positionnée +// 9997: arrêt sur aiguillage dévié +function suivant_alg3(prec : integer;BisPrec : boolean;actuel : integer;BisActuel : boolean;alg : integer) : integer; +var Btype,Adr,AdrPrec,BtypePrec,indexBranche_prec,branche_trouve_prec,indexBranche_actuel,branche_trouve_actuel, + tjsc1,tjsc2,AdrTjdP,Adr2 : integer; + Abis,tjscourbe1,tjscourbe2,tjd,tjs : boolean; + A,Aprec,tjsc1B,tjsc2B: char; +label recommence; +begin + recommence: + if NivDebug=3 then AfficheDebug('Alg3 précedent='+intToSTR(prec)+' actuel='+intToSTR(actuel),clyellow); + // trouver les éléments du précédent + trouve_element(prec,BisPrec); // branche_trouve IndexBranche_trouve + if IndexBranche_trouve=0 then + begin + if NivDebug=3 then AfficheDebug('Element '+intToSTR(prec)+' non trouvé',clred); + suivant_alg3:=9999;exit; + end; + + indexBranche_prec:=IndexBranche_trouve; + branche_trouve_prec:=branche_trouve; + BtypePrec:=BrancheN[branche_trouve_prec,indexBranche_prec].Btype; + // if BTypePrec=2 then aiguillage[prec].A + + trouve_element(actuel,BisActuel); // branche_trouve IndexBranche_trouve + if IndexBranche_trouve=0 then + begin + if NivDebug=3 then AfficheDebug('Element '+intToSTR(actuel)+' non trouvé',clred); + suivant_alg3:=9999;exit; + end; + + indexBranche_actuel:=IndexBranche_trouve; + branche_trouve_actuel:=branche_trouve; + + Adr:=actuel; + Btype:=BrancheN[branche_trouve_actuel,indexBranche_actuel].Btype; + + if Btype=1 then // l'élément actuel est un détecteur + begin + // on part de l'actuel pour retomber sur le précédent + if BrancheN[branche_trouve_actuel,indexBranche_actuel-1].Adresse=prec then // c'est l'autre sens + begin + if NivDebug=3 then AfficheDebug('40 - trouvé détecteur '+intToSTR(adr)+' en + ',clwhite); + Prec:=Adr; + Aprec:=a; + A:='Z'; + Adr:=BrancheN[branche_trouve_actuel,indexBranche_actuel+1].Adresse; + Btype:=BrancheN[branche_trouve_actuel,indexBranche_actuel+1].Btype; + Bis:=Btype=3; + if NivDebug=3 then AfficheDebug('41 - Le suivant est :'+intToSTR(adr)+'('+intToSTR(Btype)+')',clwhite); + suivant_alg3:=adr; + exit; + end; + if BrancheN[branche_trouve_actuel,indexBranche_actuel+1].Adresse=prec then + begin + if NivDebug=3 then AfficheDebug('42 - trouvé détecteur '+intToSTR(adr)+' en - ',clwhite); + Prec:=Adr; + Aprec:=a; + A:='Z'; + Adr:=BrancheN[branche_trouve_actuel,indexBranche_actuel-1].Adresse; + Btype:=BrancheN[branche_trouve_actuel,indexBranche_actuel-1].Btype; + Bis:=Btype=3; + if NivDebug=3 then AfficheDebug('43 - Le suivant est :'+intToSTR(adr)+'('+intToSTR(Btype)+')',clwhite); + suivant_alg3:=adr; + exit; + end; + // ici, les éléments sont non consécutifs. voir si l'un des deux est une TJD/TJS + if (btypePrec=2) or (btypePrec=3) then + begin + if NivDebug=3 then AfficheDebug('Le précedent est une TJD/S - substitution du precédent par la pointe de la TJD',clYellow); + // changer l'adresse du précédent par l'autre adresse de la TJD/S + prec:=Aiguillage[prec].APointe; + goto recommence; + end; + + Affiche('44 - éléments non consécutifs: Prec='+intToSTR(prec)+' Actuel='+intTostr(Actuel),clred); + if NivDebug=3 then AfficheDebug('44 - éléments non consécutifs: Prec='+intToSTR(prec)+' Actuel='+intTostr(Actuel),clred); + end; + + if (Btype>=2) then // aiguillage ou bis ou buttoir + begin + if ((aiguillage[Adr].modele=1) and (Btype=2) and not(BisActuel)) then // aiguillage normal non bis + begin + // aiguillage pris en pointe + if (aiguillage[adr].Apointe=prec) then + begin + if aiguillage[Adr].position=const_droit then + begin + if NivDebug=3 then AfficheDebug('130 - aiguillage '+intToSTR(Adr)+' Pris en pointe droit',clyellow); + AdrPrec:=Adr; + if Adr=0 then + begin + Affiche('131 - Erreur fatale',clRed);suivant_alg3:=9999;exit; + end; + BtypePrec:=Btype; + Aprec:=a; + ABis:=aiguillage[Adr].AdroitBis=1; + A:=aiguillage[Adr].AdroitB; + Adr:=aiguillage[Adr].Adroit; + trouve_element(adr,Abis); // branche_trouve IndexBranche_trouve + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].Btype; + Bis:=Abis; + suivant_alg3:=adr;exit; + end; + if aiguillage[Adr].position<>const_droit then + begin + if NivDebug=3 then AfficheDebug('133 - aiguillage '+intToSTR(Adr)+' Pris en pointe dévié',clyellow); + AdrPrec:=Adr; + if alg=3 then // on demande d'arreter si l'aiguillage pris en pointe est dévié + begin + bis:=false; + AdrDevie:=Adr; + suivant_alg3:=9997;exit; + end; + if Adr=0 then + begin Affiche('134 - Erreur fatale',clRed); + if NivDebug>=1 then AfficheDebug('134 - Erreur fatale',clRed); + suivant_alg3:=9999;exit; + end; + BtypePrec:=Btype; + Aprec:=A; + A:=aiguillage[Adr].AdevieB; + ABis:=aiguillage[Adr].AdevieBis=1; + Adr:=aiguillage[Adr].Adevie; + trouve_element(adr,Abis); // branche_trouve IndexBranche_trouve + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].Btype; + Bis:=Abis; + suivant_alg3:=adr;exit; + end; + end + else + begin + if NivDebug=3 then AfficheDebug('135 - aiguillage '+intToSTR(Adr)+' Pris en talon',clyellow); + if alg=2 then // on demande d'arreter si l'aiguillage en talon est mal positionné + begin + if aiguillage[adr].position=const_droit then + begin + if prec<>aiguillage[Adr].Adroit then + begin + if NivDebug=3 then AfficheDebug('135.1 - Aiguillage '+intToSTR(adr)+' mal positionné',clyellow); + suivant_alg3:=9998;exit; + end + else + begin + if NivDebug=3 then AfficheDebug('135.2 - Aiguillage '+intToSTR(adr)+' bien positionné',clyellow); + end; + end + else + begin + if prec<>aiguillage[Adr].Adevie then + begin + if NivDebug=3 then AfficheDebug('Aiguillage '+intToSTR(adr)+' mal positionné',clyellow); + suivant_alg3:=9998;exit; + end + else + begin + if NivDebug=3 then AfficheDebug('Aiguillage '+intToSTR(adr)+' bien positionné',clyellow); + end; + end; + end; + + AdrPrec:=Adr; + if Adr=0 then + begin Affiche('136 - Erreur fatale',clRed); + if NivDebug>=1 then AfficheDebug('136 - Erreur fatale',clRed); + suivant_alg3:=9999;exit; + end; + BtypePrec:=Btype; + APrec:=A; + // Affiche('trouvé'+intToSTR(adr),clyellow); + A:=aiguillage[Adr].ApointeB; + ABis:=aiguillage[Adr].ApointeBis=1; + Adr:=aiguillage[Adr].Apointe; + trouve_element(adr,Abis); // branche_trouve IndexBranche_trouve + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].Btype; + Bis:=Abis; + suivant_alg3:=adr;exit; + end; + Affiche('138 - Erreur fatale - Aucun cas Aiguillage',clred); + if NivDebug=3 then AfficheDebug('138 - Erreur fatale - Aucun cas Aiguillage',clred); + suivant_alg3:=9999;exit; + end; + + if ((aiguillage[Adr].modele=1) and (Btype=3) and (BisActuel)) then // aiguillage normal bis + begin + // aiguillage pris en pointe + if (aiguillageB[Adr].Apointe=Prec) then + begin + if (aiguillageB[Adr].position=const_droit) then + begin + if NivDebug=3 then AfficheDebug('140 - Aiguillage '+intToSTR(adr)+' bis pris en pointe droit',clyellow); + AdrPrec:=Adr; + if alg=3 then // on demande d'arreter si l'aiguillage pris en pointe est dévié + begin + bis:=true; + AdrDevie:=Adr; + suivant_alg3:=9997;exit; + end; + if (Adr=0) then begin Affiche('141 - Erreur fatale',clred);suivant_alg3:=9999;exit;end; + BtypePrec:=Btype; + APrec:=A; + A:=aiguillageB[Adr].AdroitB; + ABis:=aiguillageB[Adr].AdroitBis=1; + Adr:=aiguillageB[Adr].Adroit; + trouve_element(Adr,ABis); // branche_trouve IndexBranche_trouve + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + Bis:=ABis; + suivant_alg3:=Adr; exit; + end; + if (aiguillage[Adr].position<>const_droit) then + begin + AdrPrec:=Adr; + if (Adr=0) then begin Affiche('144 - Erreur fatale',clred);suivant_alg3:=9999;exit;end; + BtypePrec:=Btype; + APrec:=A; + A:=aiguillageB[Adr].AdevieB; + ABis:=aiguillageB[Adr].AdevieBis=1; + Adr:=aiguillageB[Adr].Adevie; + trouve_element(Adr,ABis); // branche_trouve IndexBranche_trouve + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + Bis:=ABis; + suivant_alg3:=Adr;exit; + end; + end + else + begin + if (NivDebug=3) then AfficheDebug('145 - Aiguillage '+IntToSTR(adr)+' bis pris en talon',clyellow); + AdrPrec:=Adr; + if (Adr=0) then begin AfficheDebug('146 - Erreur fatale',clred);suivant_alg3:=9999;exit;end; + BtypePrec:=Btype; + APrec:=A; + ABis:=aiguillageB[Adr].ApointeBis=1; + // Affiche('trouvé'+intToSTR(adr),clyellow); + A:=aiguillage[Adr].ApointeB; + Adr:=aiguillageB[Adr].Apointe; // bug + trouve_element(Adr,ABis); // branche_trouve IndexBranche_trouve + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + Bis:=ABis; + suivant_alg3:=Adr;exit; + end; + end; + + + if (aiguillage[Adr].modele=2) or (aiguillage[Adr].modele=3) then // TJD ou TJS + begin + AdrTjdP:=aiguillage[Adr].Apointe; + tjd:=aiguillage[Adr].modele=2; + tjs:=aiguillage[Adr].modele=3; + tjsc1:=aiguillage[Adr].tjsint; // adresses de la courbe de la TJD + tjsc2:=aiguillage[AdrTjdP].tjsint; + tjsc1B:=aiguillage[Adr].tjsintB; + tjsc2B:=aiguillage[AdrTjdP].tjsintB; + if tjsc1<>0 then + begin + tjscourbe1:=(aiguillage[Adr].tjsintB='S') and (aiguillage[tjsc1].position<>const_droit); + tjscourbe1:=((aiguillage[Adr].tjsintB='D') and (aiguillage[tjsc1].position=const_droit)) or tjscourbe1; + end; + if tjsc2<>0 then + begin + tjscourbe2:=(aiguillage[AdrTjdP].tjsintB='S') and (aiguillage[tjsc2].position<>const_droit); + tjscourbe2:=((aiguillage[AdrTjdP].tjsintB='D') and (aiguillage[tjsc2].position=const_droit)) or tjscourbe2; + end; + if NivDebug=3 then AfficheDebug('137 - TJD '+intToSTR(Adr)+'/'+IntToSTR(AdrTjdP),clYellow); + AdrTjdP:=aiguillage[Adr].Apointe; // adresse TJD homologue + // determiner la position de la première section de la TJD (4 cas) + // cas 1 : droit droit + if (( aiguillage[Adr].position=const_droit) and + (aiguillage[AdrTjdP].position=const_droit) and tjd) then + begin + if NivDebug=3 then AfficheDebug('cas1 tjd',clYellow); + if aiguillage[AdrTjdP].Adroit=prec then + begin + A:=aiguillage[Adr].AdroitB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[Adr].Adroit; + BisPrec:=aiguillage[Adr].AdroitBis=1; + suivant_alg3:=adr;exit; + end; + if aiguillage[Adr].Adroit=prec then + begin + A:=aiguillage[AdrTjdP].AdroitB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[AdrTjdP].Adroit; + BisPrec:=aiguillage[AdrTjdP].AdroitBis=1; + suivant_alg3:=adr;exit; + end; + //Affiche('Erreur 1021 adrTJD='+IntToSTR(Adr)+' adrTJDPointe='+intToSTR(AdrTJDP)+' prec='+IntTOSTR(prec),clred); + Suivant_alg3:=9999;exit; + end; + // cas 2 TJD + if (aiguillage[Adr].position<>const_droit) + and (aiguillage[AdrTjdP].position=const_droit) and tjd then + begin + if NivDebug=3 then AfficheDebug('cas2 tjd',clYellow); + if aiguillage[AdrTjdP].Adroit=prec then + begin + A:=aiguillage[Adr].AdevieB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[Adr].Adevie; + BisPrec:=aiguillage[Adr].AdevieBis=1; + suivant_alg3:=adr;exit; + end; + if aiguillage[Adr].Adevie=prec then + begin + A:=aiguillage[AdrTjdP].AdroitB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[AdrTjdP].Adroit; + BisPrec:=aiguillage[AdrTjdP].AdroitBis=1; + suivant_alg3:=adr;exit; + end; + //Affiche('Erreur 1022',clred); + Suivant_alg3:=9999;exit; + end; + // cas 3 TJD + if (aiguillage[Adr].position=const_droit) + and (aiguillage[AdrTjdP].position<>const_droit) and tjd then + begin + if NivDebug=3 then AfficheDebug('cas3 tjd',clYellow); + if (aiguillage[AdrtjdP].Adevie=prec) then + begin + A:=aiguillage[AdrTjdP].AdroitB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[Adr].Adroit; + BisPrec:=aiguillage[Adr].AdroitBis=1; + suivant_alg3:=adr;exit; + end; + if (aiguillage[Adr].Adroit=prec) then + begin + A:=aiguillage[Adr].AdevieB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[Adr].Adevie; + BisPrec:=aiguillage[Adr].AdevieBis=1; + suivant_alg3:=adr;exit; + end; + //Affiche('Erreur 1023',clred); + Suivant_alg3:=9999;exit; + end; + // cas 4 tjd + if (aiguillage[Adr].position<>const_droit) + and (aiguillage[AdrTjdP].position<>const_droit) then + begin + if NivDebug=3 then AfficheDebug('cas4 tjd',clYellow); + if aiguillage[AdrTjdP].Adevie=prec then + begin + A:=aiguillage[Adr].AdevieB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[Adr].Adevie; + BisPrec:=aiguillage[Adr].AdevieBis=1; + suivant_alg3:=adr;exit; + end; + if aiguillage[Adr].Adevie=prec then + begin + A:=aiguillage[AdrtjdP].AdevieB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[AdrtjdP].Adevie; + BisPrec:=aiguillage[AdrtjdP].AdevieBis=1; + suivant_alg3:=adr;exit; + end; + //Affiche('Erreur 1024',clred); + Suivant_alg3:=9999;exit; + end; + // cas TJS prise dans sa position courbe + if ((aiguillage[Adr].Adevie=Prec) and (aiguillage[Adr].AdevieB=Aprec) and (aiguillage[Adr].position<>const_droit) + and (aiguillage[AdrTjdP].position=const_droit) and (tjs) and tjscourbe1 and tjscourbe2) then + begin + if NivDebug=3 then AfficheDebug('cas tjs en courbe1',clYellow); + A:=aiguillage[AdrTjdP].AdevieB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[AdrTjdP].Adevie; + BisPrec:=aiguillage[AdrTjdP].AdroitBis=1; + suivant_alg3:=adr;exit; + end; + // cas 3 TJS prise dans sa 2eme position courbe + if ((aiguillage[Adr].Adroit=Prec) and (aiguillage[Adr].AdroitB=Aprec) and (aiguillage[Adr].position=const_droit) + and (aiguillage[AdrTjdP].position<>const_droit) and (tjs) and tjscourbe1 and tjscourbe2 ) then + begin + if NivDebug=3 then AfficheDebug('cas1 tjs en courbe 2',clYellow); + A:=aiguillage[AdrTjdP].AdevieB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[AdrTjdP].Adevie; + BisPrec:=aiguillage[AdrTjdP].AdroitBis=1; + suivant_alg3:=adr;exit; + end; + Affiche('139 - Erreur fatale - Aucun cas TJD/S : adr='+IntToSTR(Adr)+' '+intToSTR(AdrTJDP)+' prec='+IntTOSTR(prec),clred); + AfficheDebug('139 - Erreur fatale - Aucun cas TJD/S : adr='+IntToSTR(Adr)+' '+intToSTR(AdrTJDP)+' prec='+IntTOSTR(prec),clred); + suivant_alg3:=9999;exit; + end; + if (aiguillage[Adr].modele=4) then // aiguillage triple + begin + // aiguillage triple pris en pointe + Adr2:=aiguillage[Adr].AdrTriple; + // attention la lecture d'un aiguillage triple est différente suivant la connexion avec CDM + // ou avec l'interface + if ( CDM_connecte and (aiguillage[Adr].position=const_droit) ) or + ( not(CDM_connecte) and (aiguillage[Adr].position=const_droit) and (aiguillage[Adr2].position=const_droit) ) then + begin + if NivDebug=3 then AfficheDebug('Aiguillage triple droit',clYellow); + BisPrec:=aiguillage[Adr].AdroitBis=1; + //TSuiv=aiguillage[Adr].AdroitB; + Adr:=aiguillage[Adr].Adroit; + end; + if ( CDM_connecte and (aiguillage[Adr].position=const_devieG) ) or + ( not(CDM_connecte) and (aiguillage[Adr].position<>const_droit) and (aiguillage[Adr2].position=const_droit) ) then + begin + if NivDebug=3 then AfficheDebug('Aiguillage triple dévié1 (gauche)',clYellow); + BisPrec:=aiguillage[Adr].AdevieBis=1; + //TSuiv=aiguillage[Adr].AdevieB; + Adr:=aiguillage[Adr].Adevie; + end; + if ( CDM_connecte and (aiguillage[Adr].position=const_devieG) ) or + ( not(CDM_connecte) and (aiguillage[Adr].position=const_droit) and (aiguillage[Adr2].position<>const_droit) ) then + begin + if NivDebug=3 then AfficheDebug('Aiguillage triple dévié2 (droit)',clYellow); + BisPrec:=aiguillage[Adr].Adevie2Bis=1; + //TSuiv=aiguillage[Adr].Adevie2B; + Adr:=aiguillage[Adr].Adevie2; + end; + if ((aiguillage[Adr].position<>const_droit) and (aiguillage[Adr2].position<>const_droit) ) then + begin + AfficheDebug('Aiguillage triple '+IntToSTR(Adr)+' : configuration des aiguilles interdite',clYellow); + Affiche('Aiguillage triple : '+IntToSTR(Adr)+' configuration des aiguilles interdite',clRed); + //TSuiv='Z'; + suivant_alg3:=9999;exit; // pour échappement + end; + end; + end; + suivant_alg3:=adr; +end; + +// trouve l'index du feu associé au détecteur adr +function index_feu_det(adr : integer) : integer ; + var i : integer; + trouve,trouve1,trouve2,trouve3,trouve4 : boolean; +begin +i:=1; + repeat + trouve1:=feux[i].Adr_det1=adr; + trouve2:=feux[i].Adr_det2=adr; + trouve3:=feux[i].Adr_det3=adr; + trouve4:=feux[i].Adr_det4=adr; + trouve:=trouve1 or trouve2 or trouve3 or trouve4; + if not(trouve) then inc(i); + until (trouve) or (i>=100); + if trouve then Index_feu_det:=i else Index_feu_det:=0; +end; + + +// renvoie l'adresse du détecteur suivant des deux éléments contigus +function detecteur_suivant(prec : integer;BisPrec : boolean;actuel : integer;BisActuel : boolean) : integer ; +var AdrDet,actuelCalc,PrecCalc,etat,i,j,AdrSuiv : integer; + BisprecCalc,BisActuelCalc : boolean; +begin + if NivDebug>=2 then AfficheDebug('cherche détecteur suivant aux '+IntToSTR(prec)+'-'+intToSTR(actuel),clyellow); + j:=0; + + PrecCalc:=prec; + bisprecCalc:=bisprec; + ActuelCalc:=actuel; + BisActuelCalc:=BisActuel; + // étape 1 trouver le sens + repeat + inc(j); + AdrSuiv:=suivant_alg3(precCalc,BisPrecCalc,actuelCalc,BisActuelCalc,1); + precCalc:=actuelCalc; + BisPrecCalc:=BisActuelCalc; + actuelCalc:=AdrSuiv; + BisActuelCalc:=Bis; + //Affiche('Suivant signalaig='+IntToSTR(AdrSuiv),clyellow); + until (j=10) or (AdrSuiv>512) or (AdrSuiv=0); // + // si trouvé le sens, trouver le suivant + if AdrSuiv=actuel then + begin + AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,1); + end; + if NivDebug=3 then AfficheDebug('Le suivant est le '+intToSTR(AdrSuiv),clYellow); + detecteur_suivant:=AdrSuiv; +end; + +// renvoie l'adresse du détecteur suivant des deux éléments +// Det1 et Det2 peuvent être séparés par des aiguillages +function detecteur_suivant_El(el1: integer;BisDet1 : boolean;el2 : integer;BisDet2 : boolean) : integer ; +var IndexBranche_det1,IndexBranche_det2,branche_trouve_det1,branche_trouve_det2,i, + j,AdrPrec,Adr,AdrFonc,Btype : integer; + BisPrec,BisFonc,BisSuiv,Sortie : boolean; + s : string; + +begin + if NivDebug>=2 then AfficheDebug('cherche détecteur_suivant_El aux '+IntToSTR(el1)+'-'+intToSTR(el2),clyellow); + // traceDet=TRUE; + // trouver détecteur 1 + trouve_detecteur(el1); // branche_trouve IndexBranche_trouve + if (IndexBranche_trouve=0) then + begin + Affiche('élément '+IntToSTR(el1)+' non trouvé',clred); + detecteur_suivant_El:=1;exit; + end; + IndexBranche_det1:=IndexBranche_trouve; + branche_trouve_det1:=branche_trouve; + + // trouver détecteur 2 + trouve_detecteur(el2); // branche_trouve IndexBranche_trouve + if (IndexBranche_trouve=0) then + begin + Affiche('élément '+IntToSTR(el2)+' non trouvé',clred); + detecteur_suivant_El:=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 (NivDebug=4) then + begin + s:='Test route en '; + if (j=1) then s:=s+'décrément ' else s:=s+'incrément '; + s:=s+'- départ depuis détecteur '+IntToSTR(el1);Affiche(s,clyellow); + end; + AdrPrec:=el1; + BisPrec:=FALSE; + Bis:=FALSE; + 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,i].BType; // élément suivant/précédent + BisFonc:=Btype=3; // bug si aiguillage bis + i:=0; + if (el2<>Adr) then + 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 + trouve_element(Adr,Bis); + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + BisSuiv:=Btype=3; // si aiguillage bis + //Affiche(intToSTR(adr)+'/'+intToStr(Btype),clorange); + AdrPrec:=AdrFonc;AdrFonc:=Adr; + BisPrec:=BisFonc;BisFonc:=Bis; + i:=i+1; + sortie:=(Adr=El2) or (i=20) or (Adr=0) or ((Adr<>el2) and (btype=1)); + until (sortie) ; // boucle de parcours + if (i=20) then + begin Affiche('Erreur fatale 300 : Itération trop longue',clred); + AfficheDebug('Erreur fatale 300 : Itération trop longue',clred); + detecteur_suivant_el:=3;end; + if ((Btype=1) and (Adr<>el2) and (NivDebug=3)) then AfficheDebug('N''est pas le détecteur attendu '+intToSTR(Adr)+' pour '+intToSTR(el2),clyellow); + inc(j); // changement de sens + sortie:=(Adr=el2) or (j=3) or (Adr=0); + until sortie; + + // si arret sur buttoir + if Adr=0 then begin detecteur_suivant_el:=0;exit;end; + + if ((j=3) and (Adr<>el2)) then + begin + if NivDebug=3 then AfficheDebug('Pas de suivant sur séquence '+IntToSTR(el1)+' à '+intToStr(el2),clyellow); + detecteur_suivant_el:=0;exit; + end; + + // étape 2 : on a trouvé le sens de progression, trouver le détecteur suivant + if (Adr=el2) then + begin + // trouvé la route si j=2 : - si j=3 : + + if (NivDebug=3) then AfficheDebug('Route trouvée',clyellow); + i:=0; + AdrFonc:=Adr; + BisFonc:=FALSE; + BisSuiv:=FALSE; + Bis:=FALSE; + repeat + Adr:=suivant_alg3(AdrPrec,BisPrec,AdrFonc,BisFonc,1); + // if i=0 then El_suivant:=Adr; //??????? + trouve_element(Adr,Bis); + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + BisSuiv:=Btype=3; // si aiguillage bis + if (NivDebug=3) then AfficheDebug('Suivant='+IntToSTR(Adr)+ '('+intToSTR(Btype)+')',clyellow); + AdrPrec:=AdrFonc;AdrFonc:=Adr; + BisPrec:=BisFonc;BisFonc:=Bis; + inc(i); + sortie:=(Btype=1) or (Adr=0) or (i=20); + until sortie; + if NivDebug>=2 Then AfficheDebug('Détecteur suivant='+intToSTR(Adr),clOrange); + if (bType=1) or (Adr=0) then detecteur_suivant_el:=Adr; + if (i=20) then begin + if NivDebug=3 then AfficheDebug('Erreur fatale 201 : Itération trop longue',clred); + Affiche('Erreur fatale 201 : Itération trop longue',clred);detecteur_suivant_el:=3;end; + end; +end; + + + +// renvoi vrai si les aiguillages au delà du signal sont mal positionnés +function carre_signal(adresse : integer) : boolean; +var + i,j,prec,AdrFeu,AdrSuiv,actuel : integer; + multi, sort, BisPrec,BisActuel : boolean; + s : string; +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 (feux[i].VerrouCarre=FALSE) // si le feu n'est pas verrouillable au carré +// { +// if (traceDet) {sprintf(s,"Ce signal %d n'est pas verrouillable au carré\r\n",adresse); +// Display(s); +// if (echoLog) fputs(s,fichier);} +// return FALSE; +// } + j:=0; + prec:=feux[i].Adr_det1; + BisPrec:=FALSE; + actuel:=feux[i].Adr_el_suiv1; + BisActuel:=feux[i].Btype_suiv1=5; + multi:=feux[i].Adr_det2<>0; + // trouver si une des voies présente un train + if (multi) then + begin + carre_signal:=FALSE; // pour l'instant verrouillé + exit; + end; + + //Affiche(IntToSTR(actuel),clyellow); + repeat + inc(j); + AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,2); + if (AdrSuiv<>9998) then // arret sur aiguillage en talon mal positionnée + begin + prec:=actuel; + BisPrec:=BisActuel; + actuel:=AdrSuiv; + BisActuel:=Bis; + end; + // si le suivant est un détecteur comporte t-il un signal? + AdrFeu:=0; + if (AdrSuiv>500) then + begin + AdrFeu:=index_feu_det(AdrSuiv); + //Affiche(IntToSTR(AdrFeu),clOrange); + end; + sort:=(j=10) or (AdrFeu<>0) or (AdrSuiv=9998) or (AdrSuiv=0); // arret si aiguillage en talon ou buttoir + until (sort); + // si trouvé un feu ou j=10, les aiguillages sont bien positionnés + // si trouvé 9998, aiguillages mal positionnés + if (NivDebug=3) then + begin + if (AdrSuiv=9998) then AfficheDebug('Le signal '+intToSTR(adresse)+' doit afficher un carré car l''aiguillage pris en talon '+IntToSTR(actuel)+' est mal positionné',clYellow) + else AfficheDebug('Le signal '+IntToSTR(adresse)+' ne doit pas être au carré',clYellow); + end; + carre_signal:=AdrSuiv=9998; +end; + + +// renvoie l'état du signal suivant +// si renvoie 0, pas trouvé le signal suivant. +// rang=1 pour feu suivant, 2 pour feu suivant le 1, etc +function etat_signal_suivant(adresse,rang : integer) : integer ; +var num_feu,AdrDet,etat,AdrFeu,i,j,prec,AdrSuiv : integer; + BisPrec,BisActuel : boolean; +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 + Affiche('Erreur 600 - feu non trouvé',clred); + etat_signal_suivant:=0; + exit; + end; + Etat:=0; + j:=0; + num_feu:=0; + prec:=Feux[i].Adr_det1; // détecteur sur le courant + if prec=0 then + begin + Affiche('Msg 601 - feu '+intToSTR(adresse)+' non renseigné ',clOrange); + etat_signal_suivant:=0; + exit; + end; + BisPrec:=false; + actuel:=feux[i].Adr_el_suiv1; + BisActuel:=feux[i].btype_suiv1=5; + + // si actuel est un détecteur, regarder si il ya un feu + repeat + inc(j); + // à la première itération, si "actuel" est déja un détecteur, ne pas faire de recherche sur le suivant + if (j=1) and (actuel>512) then + begin + AdrSuiv:=actuel; + actuel:=prec; + BisPrec:=FALSE; + BisActuel:=FALSE; + end + else + AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,1); + + if (AdrSuiv=9999) then + begin + Etat_signal_suivant:=0; + exit; + end; + if (AdrSuiv=0) then + begin + if NivDebug=3 then AfficheDebug('Le suivant est un buttoir',clyellow); + Etat_signal_suivant:=carre_F; // faire comme si c'était un signal au carré + exit; + end; + + prec:=actuel; + BisPrec:=BisActuel; + actuel:=AdrSuiv; + BisActuel:=Bis; + // si le suivant est un détecteur comporte t-il un signal? + + AdrFeu:=0; + if (AdrSuiv>512) then + begin + i:=Index_feu_det(AdrSuiv); + AdrFeu:=Feux[i].Adresse; + //affiche(intToSTR(Feux[i].Adr_el_suiv)+'/'+intTostr(prec),clyellow); + 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 + 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 + // oui + inc(num_feu); + Etat:=EtatSignalCplx[AdrFeu]; + Signal_suivant:=AdrFeu; + if NivDebug=3 then AfficheDebug('Trouvé feu suivant Adr='+IntToSTR(AdrFeu)+'='+IntToSTR(etat),clOrange); + end + else + begin + if NivDebug=3 then AfficheDebug('Trouvé feu '+intToSTR(AdrFeu)+' mais dans le mauvais sens',clOrange); + AdrFeu:=0; + end; + end; + end; + until (j=10) or ((AdrFeu<>0) and (num_feu=rang)); + if etat=0 then Signal_Suivant:=0; + etat_signal_suivant:=Etat; + if NivDebug=3 then AfficheDebug('Pas Trouvé de feu suivant au feu Adr='+IntToSTR(ADresse),clOrange); + //TraceDet:=false; +end; + + +// renvoie l'adresse de l'aiguille si elle est déviée après le signal et ce jusqu'au prochain signal +// sinon renvoie 0 +// adresse=adresse du signal +function Aiguille_deviee(adresse : integer) : integer ; +var AdrDet,AdrFeu,etat,i,j,prec,AdrSuiv,Actuel : integer; + BisPrec,BisActuel : boolean; + s : string; +begin + //traceDet:=true; + if NivDebug>=2 then AfficheDebug('test si aiguille déviée après signal '+IntToSTR(Adresse),clyellow); + j:=0; + i:=Index_feu(adresse); + prec:=feux[i].Adr_det1; + BisPrec:=false; + actuel:=feux[i].Adr_el_suiv1; + BisActuel:=feux[i].btype_suiv1=3; + //Affiche(IntToSTR(actuel),clyellow); + AdrFeu:=0; + AdrDevie:=0; + if (actuel<512) then + begin + if (aiguillage[actuel].Apointe=prec) and (aiguillage[actuel].position<>const_droit) then Aiguille_deviee:=actuel; + end; + + repeat + inc(j); + // 3=demande si le suivant est un aiguillage en pointe dévié oui si AdrSuiv=9997 + // dans ce cas la variable globale AdrDevie est mise à jour + AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,3); + if NivDebug=3 then AfficheDebug('701 - Suivant signalaig='+IntToSTR(AdrSuiv),clyellow); + if ADrSuiv<>9997 then + begin + prec:=actuel; + BisPrec:=BisActuel; + actuel:=AdrSuiv; + BisActuel:=Bis; + // si le suivant est un détecteur comporte t-il un signal? + AdrFeu:=0; + if (AdrSuiv>512) then + begin + i:=Index_feu_det(AdrSuiv); + AdrFeu:=Feux[i].Adresse; + if NivDebug=3 then AfficheDebug('trouvé signal '+intToSTR(AdrFeu)+' associé au détecteur '+IntToSTR(AdrSuiv),clyellow); + end; + end; + until (j=10) or (AdrSuiv=9997) or (AdrFeu<>0) ; + if (AdrSuiv=9997) then + begin + s:='le signal '+intToSTR(adresse)+' doit afficher un rappel car l''aiguillage '+intToSTR(AdrDevie); + if bis then s:=s+'bis'; + s:=s+' est dévié'; + if NivDebug=3 then AfficheDebug(s,clYellow); + end; + if ((AdrSuiv<>9997) or (j=10)) and (NivDebug=3) then + begin + S:='le signal '+intToSTR(adresse)+' ne doit pas afficher de rappel car '; + if j<>10 then s:=s+'trouvé un autre signal suivant et pas d''aiguillage dévié' + else s:=s+' signal trop éloigné'; + AfficheDebug(s,clYellow); + end; + Aiguille_deviee:=AdrDevie; +end; + +// renvoie vrai si une mémoire de zone est occupée du signal courant au signal suivant +// a compléter par les 4 détecteurs.... +function test_memoire_zones(adresse : integer) : boolean; +var + ife,Detecteur_precedent,actuel,AdrDet,Etat,AdrFeu,i,j,prec,AdrSuiv : integer; + Pres_train,sort,BisPrec,BisActuel : boolean; +begin + if NivDebug>=1 then AfficheDebug('Cherche mémoire à 1 du signal '+intToSTR(adresse)+' au signal suivant ',clyellow); + + i:=Index_feu(adresse); + if (i=0) then + begin + Affiche('Erreur 650 - feu non trouvé',clred); + AfficheDebug('Erreur 650 - feu non trouvé',clred); + test_memoire_zones:=false; + end; + + + 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',clred); + if (ife=1) then begin prec:=feux[i].Adr_det1;actuel:=feux[i].Adr_el_suiv1;BisActuel:=feux[i].Btype_suiv1=5;end; //détecteur sur le signal courant + if (ife=2) then begin prec:=feux[i].Adr_det2;actuel:=feux[i].Adr_el_suiv2;BisActuel:=feux[i].Btype_suiv2=5;end; // détecteur sur le signal courant + if (ife=3) then begin prec:=feux[i].Adr_det3;actuel:=feux[i].Adr_el_suiv3;BisActuel:=feux[i].Btype_suiv3=5;end; // détecteur sur le signal courant + if (ife=4) then begin prec:=feux[i].Adr_det4;actuel:=feux[i].Adr_el_suiv4;BisActuel:=feux[i].Btype_suiv4=5;end; // détecteur sur le signal courant + + Detecteur_precedent:=prec; + if (prec=0) then + begin + test_memoire_zones:=Pres_train; + exit; + end; + BisPrec:=FALSE; + + 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 (actuel>512) then + begin + AdrSuiv:=actuel; + actuel:=prec; + BisPrec:=FALSE; + BisActuel:=FALSE; + Pres_train:=MemZone[prec,actuel]; + if Pres_Train and (NivDebug=3) then Affiche('Présence train de '+intToSTR(prec)+' à '+intToSTR(actuel),clyellow); + Detecteur_precedent:=actuel; + end + else + AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,1); + + prec:=actuel; + BisPrec:=BisActuel; + actuel:=AdrSuiv; + BisActuel:=Bis; + + if AdrSuiv=0 then + begin + // si c'est un buttoir + test_memoire_zones:=false; + exit; + end; + // si le suivant est un détecteur comporte t-il un signal? + AdrFeu:=0; + if (AdrSuiv>512) then + begin + if (NivDebug=3) and MemZone[Detecteur_precedent][actuel] then AfficheDebug('Présence train de '+intToSTR(Detecteur_precedent)+' à '+intToSTR(actuel),clyellow); + + Pres_train:=MemZone[Detecteur_precedent][actuel] or Pres_train; // mémoire de zone + Detecteur_precedent:=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 + begin + AdrFeu:=0;j:=10; // on ne trouve pas de suivant + 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 + 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); + test_memoire_zones:=Pres_train;exit; + end + else + begin + if NivDebug=3 then AfficheDebug('Trouvé feu '+intToSTR(AdrFeu)+' mais dans le mauvais sens',clOrange); + AdrFeu:=0; + 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) ; + until (sort); + 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; + + + +// calcul des zones depuis le tableau des fronts descendants des évènements détecteurs +// 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 : integer; + BisPrec,BisSuiv,BisFonc,sortie : boolean; + s : string; + +begin + // traceDet=TRUE; + // trouver détecteur 1 + trouve_detecteur(det1); // branche_trouve IndexBranche_trouve + if (IndexBranche_trouve=0) then + begin + Affiche('détecteur '+IntToSTR(det1)+' non trouvé',clred); + calcul_zones_det:=1;exit; + 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 (NivDebug=3) then + begin + s:='Test 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);Affiche(s,clyellow); + end; + AdrPrec:=det1; + BisPrec:=FALSE; + Bis:=FALSE; + 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,i].BType; // élément suivant/précédent + BisFonc:=Btype=3; // bug si aiguillage bis + i:=0; + if (det2<>Adr) then + 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 + trouve_element(Adr,Bis); + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + BisSuiv:=Btype=3; // si aiguillage bis + //Affiche(intToSTR(adr)+'/'+intToStr(Btype),clorange); + AdrPrec:=AdrFonc;AdrFonc:=Adr; + BisPrec:=BisFonc;BisFonc:=Bis; + i:=i+1; + sortie:=(Btype=1) or (Btype=4) or (i=20) or (Adr=0); + until (sortie) ; // boucle de parcours + + 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 (NivDebug=3) ) 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 (NivDebug=3) 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 (NivDebug=3) then AfficheDebug('Route trouvée',clyellow); + i:=0; + AdrFonc:=Adr; + BisFonc:=FALSE; + BisSuiv:=FALSE; + Bis:=FALSE; + repeat + Adr:=suivant_alg3(AdrPrec,BisPrec,AdrFonc,BisFonc,1); + //if i=0 then El_suivant:=Adr; + trouve_element(Adr,Bis); + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + BisSuiv:=Btype=3; // si aiguillage bis + if (NivDebug=3) then AfficheDebug('Suivant='+IntToSTR(Adr)+ '('+intToSTR(Btype)+')',clyellow); + AdrPrec:=AdrFonc;AdrFonc:=Adr; + BisPrec:=BisFonc;BisFonc:=Bis; + inc(i); + sortie:=(Btype=1) or (Adr=0) or (i=20); + until sortie; + if (i=20) then begin Affiche('Erreur fatale 201 : Itération trop longue',clred); + AfficheDebug('Erreur fatale 201 : Itération trop longue',clred);calcul_zones_det:=3;end; + + // le train vient de det1, quitte det2 et va vers Adr + Mem[det1]:=false; + Mem[det2]:=true; + MemZone[det1,det2]:=FALSE; // efface canton précédent + MemZone[det2,Adr]:=TRUE; // valide le nouveau canton + precedent:=det1; + Actuel:=det2; + Suivant:=Adr; + //if (aff_det) then + //begin Affiche('MemZone '+intToStr(det1)+' 0',clyellow); Affiche('MemZone '+intToStr(det2)+' 1',clyellow); end; + + Affiche('Mem '+IntToSTR(det2)+' à '+IntTOStr(Adr),clyellow); + + //if (echoLog) then writeln(fichier,'itération '+intTOstr(iteration)+' - Mem '+IntToSTR(det2)+' à '+IntToSTR(Adr),clyellow); + calcul_zones_det:=10; + exit; // réussi + end; +end; + + +// renvoie le détecteur de la zone mémoire si la mémoire MemZone[det,xxx] est à 1 +// exemple si MemZone[512,517]=true alors Test_mem_origine(512) renvoie 517, sinon 0 +function Test_mem_origine(det : integer) : integer ; +var i : integer; + trouve : boolean; +begin + i:=513; + 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); +var i,j,k1,k2,BtypeSuiv,Adr_det,etat,Adr,Aig,DetPrec1,DetPrec2,Detprec3,Detprec4,Adr_El_Suiv, + Btype_el_suivant,det_initial,bt,el_suiv : integer ; + bisSuiv,PresTrain,Aff_semaphore,AffSignal,car : boolean; +begin + //if AdrFeu=344 then AffSignal:=true; + if AffSignal then Affiche('Traitement du feu '+intToSTR(Adrfeu),clOrange); + if NivDebug>=1 then AfficheDebug('Traitement du feu '+intToSTR(Adrfeu)+'------------------------------------',clOrange); + i:=index_feu(Adrfeu); + if AdrFeu<>0 then + begin + Adr_det:=Feux[i].Adr_det1; // détecteur sur le signal + Adr_El_Suiv:=Feux[i].Adr_el_suiv1; // adresse élément suivant au feu + Btype_el_suivant:=Feux[i].Btype_suiv1; + etat:=etat_signal_suivant(AdrFeu,1) ; // état du signal suivant + adresse du signal suivant dans Signal_Suivant + + // signaux traités spécifiquement + if (AdrFeu=201) then + begin + //sprintf(Affiche,"Aiguille 27=%d \r\n",aiguillage[27].position);Display(Affiche); + // sprintf(Affiche,"Aiguille 31=%d \r\n",aiguillage[31].position);Display(Affiche); + if ((aiguillage[28].position<>const_droit) and (aiguillage[29].position<>const_droit) and + (aiguillage[31].position=const_devieD)) then + Maj_Etat_Signal(AdrFeu,blanc) else Maj_Etat_Signal(AdrFeu,violet); + envoi_LEB(AdrFeu); + exit; + end; + if (AdrFeu=217) then + begin + if ((aiguillage[24].position<>const_droit) and (aiguillage[26].position<>const_droit)) then + Maj_Etat_Signal(AdrFeu,blanc) else Maj_Etat_Signal(AdrFeu,violet); + envoi_LEB(AdrFeu); + exit; + end; + + + if (Feux[i].aspect=2) then //or (feux[i].check<>nil) then // si carré violet + begin + if carre_signal(AdrFeu) and (Feux[i].aspect=2) then + begin Maj_Etat_Signal(AdrFeu,violet) ; Envoi_signauxCplx; + exit; + end + else if not(carre_signal(AdrFeu)) then //ici ya pas de check and feux[i].check.checked then + begin Maj_Etat_Signal(AdrFeu,blanc);Envoi_signauxCplx; + exit; + end; + end; + + if AffSignal then Affiche('Debut du traitement général',clYellow); + if NivDebug>=2 then AfficheDebug('Début du traitement général',clYellow); + // traitement des feux >3 feux différents de violet (cas général) + if (Feux[i].aspect>=3) and (EtatSignalCplx[AdrFeu]<>violet_F) then + begin + // 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[i].VerrouCarre then + begin + if AffSignal then Affiche('Le feu est verrouillable au carré',clyellow); + if NivDebug>=1 then AfficheDebug('Le feu est verrouillable au carré',clyellow); + // un feu peut être associé à 4 détecteurs (pour 4 voies) + // il faut donc explorer les 4 détecteurs probables + PresTrain:=FALSE; + + j:=1; + repeat + if NivDebug=3 then afficheDebug('Séquence '+IntToSTR(j)+' de recherche des 4 détecteurs précédents-----',clOrange); + if (j=1) then begin det_initial:=feux[i].Adr_det1;Adr_El_Suiv:=feux[i].Adr_el_suiv1; Btype_el_suivant:=feux[i].Btype_suiv1;end; + if (j=2) then begin det_initial:=feux[i].Adr_det2;Adr_El_Suiv:=feux[i].Adr_el_suiv2; Btype_el_suivant:=feux[i].Btype_suiv2;end; + if (j=3) then begin det_initial:=feux[i].Adr_det3;Adr_El_Suiv:=feux[i].Adr_el_suiv3; Btype_el_suivant:=feux[i].Btype_suiv3;end; + if (j=4) then begin det_initial:=feux[i].Adr_det4;Adr_El_Suiv:=feux[i].Adr_el_suiv4; Btype_el_suivant:=feux[i].Btype_suiv4;end; + if (det_initial<>0) then + begin + DetPrec1:=detecteur_suivant(Adr_El_Suiv,Btype_el_suivant=5,det_initial,false); + if DetPrec1<>9999 then // route bloquée par aiguillage mal positionné + begin + DetPrec2:=detecteur_suivant_El(det_initial,False,DetPrec1,false); + if DetPrec2<>9999 then + begin + DetPrec3:=detecteur_suivant_El(DetPrec1,false,DetPrec2,false); + if DetPrec3<>9999 then + begin + //DetPrec4:=detecteur_suivant_det(DetPrec2,DetPrec3); + if AffSignal then Affiche('les détecteurs précédents au feu '+IntToSTR(Adrfeu)+' sont:'+intToSTR(Det_initial)+' '+intToSTR(DetPrec1)+' '+intToSTR(DetPrec2)+' '+intToSTR(DetPrec3)+' ',clyellow); + PresTrain:=//MemZone[DetPrec4,detPrec3] or + MemZone[DetPrec3,detPrec2] or MemZone[DetPrec2,detPrec1] or MemZone[DetPrec1,Det_initial] or presTrain ; + // Affiche('MemZone'+intToSTR(DetPrec3)+' '+IntToSTR(detPrec2) = '+MemZone[DetPrec3,detPrec2] + end; + end; + end; + end; + inc(j); + until (j>=5); + if presTrain and AffSignal Then affiche('présence train feu '+intToSTR(AdrFeu),clorange); + end; + if AffSignal then affiche('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é + car:=carre_signal(AdrFeu); + if AffSignal and car then Affiche('le signal a des aiguilles en talon aval mal positionnées',clYellow); + if (NivDebug>=1) and car then AfficheDebug('le signal a des aiguilles en talon aval mal positionnées',clYellow); + if (Feux[i].aspect>=4) and ( (not(PresTrain) and Feux[i].VerrouCarre) or car) then Maj_Etat_Signal(AdrFeu,carre) + else + begin + // si on quitte le détecteur on affiche un sémaphore : attention tester le sens de circulation + // pour ne pas passer au rouge un feu à contresens. + // trouver la mémoire de zone MemZone[Adr_det,?] qui a déclenché le feu rouge + if AffSignal then Affiche('test du sémaphore',clYellow); + if (NivDebug>=1) then AfficheDebug('test du sémaphore',clYellow); + Aff_semaphore:=test_memoire_zones(AdrFeu); // test si présence train après signal + if Aff_Semaphore then + begin + if AffSignal then Affiche('train après signal-> sémaphore ou carré',clYellow); + if (NivDebug>=1) and car then AfficheDebug('train après signal-> sémaphore ou carré',clYellow); + if testBit(EtatSignalCplx[Adrfeu],carre)=FALSE then Maj_Etat_Signal(AdrFeu,semaphore); + end + else + begin + // si aiguille locale déviée + Aig:=Aiguille_deviee(Adrfeu); + if (aig<>0) and (feux[i].aspect>=9) then // si le signal peut afficher un rappel et aiguille déviée + begin + if AffSignal then Affiche('Aiguille '+intToSTR(aig)+' déviée',clYellow); + if (NivDebug>=1) then AfficheDebug('Aiguille '+intToSTR(aig)+' déviée',clYellow); + EtatSignalCplx[AdrFeu]:=0; + if (aiguillage[aig].vitesse=30) or (aiguillage[aig].vitesse=0) then Maj_Etat_Signal(AdrFeu,rappel_30); + if aiguillage[aig].vitesse=60 then Maj_Etat_Signal(AdrFeu,rappel_60); + + // si signal suivant affiche rappel ou rouge + if (TestBit(etat,rappel_60)) or (testBit(etat,rappel_30)) or (testBit(etat,carre)) or (testBit(etat,semaphore)) + then Maj_Etat_Signal(AdrFeu,jaune) + else + begin + // sinon si signal suivant=jaune + if (TestBit(etat,jaune)) then Maj_Etat_Signal(AdrFeu,jaune_cli); + end; + end + else + // aiguille locale non déviée + // si le signal suivant est rouge + begin + if AffSignal then Affiche('pas d''aiguille déviée',clYellow); + if (NivDebug>=1) then AfficheDebug('pas d''aiguille déviée',clYellow); + if TestBit(etat,carre) or testBit(etat,semaphore) or testBit(etat,semaphore_cli )then Maj_Etat_Signal(AdrFeu,jaune) + else + begin + // si signal suivant affiche rappel + if TestBit(etat,rappel_30) or TestBit(etat,rappel_60) then + begin + EtatSignalCplx[AdrFeu]:=0; + if TestBit(etat,rappel_30) then Maj_Etat_Signal(AdrFeu,ral_30); + if TestBit(etat,rappel_60) then + begin + Maj_Etat_Signal(AdrFeu,ral_60); // si signal suivant est au rappel60, il faut tester s'il est à l'avertissement aussi + if TestBit(etat,jaune) then Maj_Etat_Signal(AdrFeu,jaune_cli); + end; + end + else + // si le signal suivant est jaune + if TestBit(etat,jaune) then Maj_Etat_Signal(AdrFeu,jaune_cli) + else Maj_Etat_Signal(AdrFeu,vert) + end; + end; + end; + end; + end; + end; + envoi_signauxCplx; + AffSignal:=false; +end; + +Procedure Maj_feux; +var i : integer; +begin + Maj_feux_cours:=TRUE; + for i:=1 to NbreFeux do + begin + Maj_feu(Feux[i].Adresse); + end; + Maj_feux_cours:=FALSE; +end; + + +procedure rafraichit; +begin + //Affiche('Procédure rafraichit',cyan); +// calcule_memoires; // mise à jour des mémoires de zone + begin + Maj_feux; + //Maj_feux; + end +end; + +// met à jour le signal adr dont le détecteur vient d'être franchi dans le bon sens +procedure signal(SignalCplx,detecteurAct,detecteurSuiv : integer); +begin + // + if MemZone[detecteurAct,detecteurSuiv] then if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); +end; + +// trouve l'index d'un détecteur dans une branche depuis la fin de la branche +// si pas trouvé, renvoie 0 +function index_detecteur_fin(det,Num_branche : integer) : integer; +var dernier,i,j : integer; + trouve : boolean; + procedure recherche; + begin + repeat + if BrancheN[Num_Branche,i].Btype=1 then // cherche un détecteur + begin + j:=BrancheN[Num_Branche,i].adresse; + trouve:=det=j; + end; + if not(trouve) then dec(i); + until trouve or (j=0) + end; +begin + // déterminer la fin de la branche + i:=1; + repeat + inc(i); + until (BrancheN[Num_Branche,i].adresse=0) and (BrancheN[Num_Branche,i].btype=0); + dernier:=i-1; + // Affiche('dernier'+intToSTR(dernier),clwhite); + + // rechercher le détecteur depuis l'index i + i:=dernier;index2_det:=0; + recherche; + if trouve then result:=i else result:=0; + //affiche(inttostr(ai+1),clOrange); + + //affiche('------------------------',clWhite); + recherche; + //affiche('------------------------',clGreen); + if trouve then index2_det:=i else index2_det:=0; + //affiche('index2='+IntToSTR(index2_det),clWhite); +end; + + +// supprime un évènement détecteur dans la liste +procedure supprime_event(i : integer); +var l : integer; +begin + for l:=i to N_Event_det do event_det[l]:=event_det[l+1]; + dec(N_event_det); +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 à jout le tableau MemZone +procedure calcul_zones ; +var i,det1,det2,index_1,index_2,index_3,resultat : integer; + unevalide,traceListe : boolean; + label refaire; +begin + uneValide:=false; + traceListe:=false; + //N_event_det pointe sur le dernier détecteur + refaire: + with FormDebug.MemoEvtDet do + begin + lines.clear; + for index_3:=1 to N_event_det do lines.add(intToSTR(event_det[index_3])); + end; + + if traceListe then + begin + Affiche('Liste',clyellow); + for index_3:=1 to N_event_det do affiche(intToSTR(event_det[index_3]),clyellow); + end; + if N_event_det<2 then begin exit;end; // pas assez de détecteurs pour évaluer + // balayer index 1 à 2 puis 1 à 3 puis 1 à N_event_det et ensuite + // de 2 à 3 puis de 2 à 4 puis de 2 à 5 etc + index_1:=1; + repeat + index_2:=index_1+1; + repeat + det1:=event_det[index_1]; + det2:=event_det[index_2]; + if det1=det2 then // si détecteurs identiques, supprimer le 2eme + begin + if traceListe then Affiche('trouvé doublon',clyellow); + supprime_event(index_2); + if traceListe then for index_3:=1 to N_event_det do affiche(intToSTR(event_det[index_3]),clyellow); + goto refaire; + end; + if traceListe then Affiche('cherche '+intToSTR(det1)+' '+intToSTR(det2)+' '+intToSTR(index_1)+' '+intToSTR(index_2)+' '+intToSTR(N_event_det),clyellow); + resultat:=calcul_zones_det(det1,det2); + if resultat=10 then + begin + FormDebug.MemoEvtDet.lines.add('route traitée de '+intToSTR(det1)+' à '+IntToSTR(det2)); + uneValide:=true; + supprime_event(index_1); + FormDebug.MemoEvtDet.lines.add('Nouveau Tampon:'); + for index_3:=1 to N_event_det do FormDebug.MemoEvtDet.lines.add(intToSTR(event_det[index_3])); + end; + + // détecteur1 non trouvé + if resultat=1 then begin supprime_event(index_1);goto refaire;end; + // détecteur2 non trouvé + if resultat=2 then begin supprime_event(index_2);goto refaire;end; + inc(index_2); + //Affiche('index2='+IntToSTR(index_2),clyellow); + until (index_2>N_event_det); + inc(index_1); + until (index_1>=N_event_det); + // si on a trouvé au moins une route valide, rafraichir les signaux + if uneValide then + begin + rafraichit; + rafraichit; + rafraichit; + end; +end; + + + + +// demande l'état d'un accessoire. Le résultat sera réceptionné sur réception des informations +// de rétrosignalisation. +procedure demande_info_acc(adresse : integer); +var s : string; + n : integer; +begin + // envoyer 2 fois la commande, une fois avec N=0 pour récupérer le nibble bas, + // une autre fois avec N=1 pour récupérer le nibble haut + s:=#$FF+#$FE+#$42+char((adresse-1) div 4); + n:=$80+((adresse-1) mod 4) div 2; + s:=s+char(n); // N=0 (bit 0) + s:=checksum(s); + envoi(s); + + s:=#$FF+#$FE+#$42+char((adresse-1) div 4); + n:=$80+((adresse-1) mod 4) div 2; + s:=s+char(n or 1); // N=1 (bit 0) + s:=checksum(s); + envoi(s); +end; + +// demande l'état de tous les accessoires +procedure demande_etat_acc; +var i : integer; +begin + Affiche('Demande état des aiguillages',ClYellow); + for i:=1 to maxaiguillage do + begin + demande_info_acc(i); + end; +end; + +// le décodage de la rétro est appellée sur une réception d'une trame de la rétrosignalisation. +// On déclenche ensuite le rafraichissement +procedure decode_retro(adresse,valeur : integer); +var s : string; + adraig,bitsITT,i : integer; +begin + //affiche(IntToSTR(adresse)+intToSTR(valeur),clorange); + bitsITT:=(valeur and $E0); + // bit à 010X XXXX = c'est un module de rétrosignalisation (pas un aiguillage) + // doc LENZ Xpressnet protocol description page 31 + detecteur_chgt:=0; + dem_calcul_zone:=false; + if (valeur and $10)=$10 then // si bit N=1, les 4 bits de poids faible sont les 4 bits de poids fort du décodeur + begin + // détermine le détecteur qui a changé d'état + // -------état du détecteur + if bitsITT=$40 then // module de rétro = détecteur + begin + // affecter l'état des détecteurs + i:=adresse*8+8; + if detecteur[i]<>((valeur and $8) = $8) then // si changement de l'état du détecteur bit 7 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $8) = $8; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + + i:=adresse*8+7; + if detecteur[i]<>((valeur and $4) = $4) then // si changement de l'état du détecteur bit 6 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $4) = $4; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + + i:=adresse*8+6; + if detecteur[i]<>((valeur and $2) = $2) then // si changement de l'état du détecteur bit 5 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $2) = $2; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + + i:=adresse*8+5; + if detecteur[i]<>((valeur and $1) = $1) then // si changement de l'état du détecteur bit 4 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $1) = $1; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + end; + + // état de l'aiguillage + if bitsITT=$00 then // module d'aiguillages, N=1 + begin + adraig:=((adresse * 4)+1 ); // *4 car N=1, c'est le "poids fort" + if (valeur and $C)=$8 then + begin + aiguillage[adraig+3].position:=2 ; // état aiguillage haut + if trace then begin s:='accessoire '+intToSTR(adraig+3)+'=2';Affiche(s,clYellow);end; + end; + if (valeur and $C)=$4 then + begin + aiguillage[adraig+3].position:=1 ; // état aiguillage haut + if trace then begin s:='accessoire '+intToSTR(adraig+3)+'=1';Affiche(s,clYellow);end; + end; + if (valeur and $3)=$2 then + begin + aiguillage[adraig+2].position:=2; // état aiguillage bas + if trace then begin s:='accessoire '+intToSTR(adraig+2)+'=2';Affiche(s,clYellow);end; + end; + if (valeur and $3)=$1 then + begin + aiguillage[adraig+2].position:=1; // état aiguillage bas + if trace then begin s:='accessoire '+intToSTR(adraig+2)+'=1';Affiche(s,clYellow);end; + end; + end; + end; + + if (valeur and $10)=$00 then // si bit N=0, les 4 bits de poids faible sont les 4 bits de poids faible du décodeur + begin + //Affiche('N=0',clYellow); + if bitsITT=$40 then // module de rétro + begin + // affecter l'état des détecteurs + i:=adresse*8+4; + if detecteur[i]<>((valeur and $8) = $8) then // si changement de l'état du détecteur bit 7 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $8) = $8; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + + i:=adresse*8+3; + if detecteur[i]<>((valeur and $4) = $4) then // si changement de l'état du détecteur bit 6 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $4) = $4; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + + i:=adresse*8+2; + if detecteur[i]<>((valeur and $2) = $2) then // si changement de l'état du détecteur bit 5 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $2) = $2; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + + i:=adresse*8+1; + if detecteur[i]<>((valeur and $1) = $1) then // si changement de l'état du détecteur bit 4 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $1) = $1; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + + end; + if bitsITT=$00 then // module d'aiguillages + begin + adraig:=(adresse * 4)+1; + if (valeur and $C)=$8 then + begin + aiguillage[adraig+1].position:=2 ; // état aiguillage haut + if trace then begin s:='accessoire '+intToSTR(adraig+1)+'=2';Affiche(s,clYellow);end; + end; + if (valeur and $C)=$4 then + begin + aiguillage[adraig+1].position:=1 ; // état aiguillage haut + if trace then begin s:='accessoire '+intToSTR(adraig+1)+'=1';Affiche(s,clYellow);end; + end; + if (valeur and $3)=$2 then + begin + aiguillage[adraig].position:=2; // état aiguillage bas + if trace then begin s:='accessoire '+intToSTR(adraig)+'=2';Affiche(s,clYellow);end; + end; + if (valeur and $3)=$1 then + begin + aiguillage[adraig].position:=1; // état aiguillage bas + if trace then begin s:='accessoire '+intToSTR(adraig)+'=1';Affiche(s,clYellow);end; + end; + + end; + end; + //if test_leb=false then rafraichit; + if dem_calcul_zone then calcul_zones; + //Affiche('Rafraichit',clorange); +end; + +function decode_chaine_retro(s : string) : string; +var i : integer; + chaineInt : string; +begin + chaineInt:=s; + i:=pos(#$FF+#$FD+#$42,chaineInt); + if (i<>0) and (length(chaineInt)>=5) then + begin + delete(chaineInt,i,3); + decode_retro(ord(chaineInt[i]),ord(chaineInt[i+1])); + delete(chaineInt,i,3); + end + else + begin + i:=pos(#$FF+#$FD+#$81,chaineInt); + if (i<>0) and (length(chaineInt)>=5) then + begin + delete(chaineInt,i,5); + Affiche('Voie hors tension msg1',clRed); + end + else + begin + i:=pos(#$FF+#$FD+#$61,chaineInt); + if (i<>0) and (length(chaineInt)>=5) then + begin + delete(chaineInt,i,5); + Affiche('Voie hors tension msg2',clRed); + Hors_tension2:=true; + end + else + begin + i:=pos(#$FF+#$FD+#$46+#$43+#$40,chaineInt); + if (i<>0) and (length(chaineInt)>=6) then + begin + delete(chaineInt,i,6); + Affiche('Reprise msg 1',clOrange); + Hors_tension2:=false; + end + else + begin + i:=pos(#$FF+#$FD+#$46+#$43+#$50,chaineInt); + if (i<>0) and (length(chaineInt)>=6) then + begin + delete(chaineInt,i,6); + Affiche('Reprise msg 2',clOrange); + Hors_tension2:=false; + end + else + begin + affiche('Erreur 2, chaîne rétrosig. inconnue recue:',clRed); + affiche(chaine_HEX(chaineInt),clred); + chaineInt:=''; + end; + end; + end; + end; + end; + decode_chaine_retro:=chaineint; +end; + +// procédure appellée après réception sur le port USB ou socket +procedure interprete_reponse(chaine : string); +var chaineInt,msg : string; + i : integer; + +begin + //if test_leb then exit; + chaineInt:=chaine; + //ack:=false; + //nack:=false; + while length(chaineINT)>=5 do + begin + i:=pos(#$ff+#$fe,chaineINT); + if (i<>0) and (length(chaineINT)>3) then + begin + msg:=''; + delete(chaineINT,i,2); + if chaineINT[1]=#1 then + begin + case chaineINT[i+1] of + #1 : begin nack:=true;msg:='erreur timout transmission';end; + #2 : begin nack:=true;msg:='erreur timout centrale';end; + #3 : begin nack:=true;msg:='erreur communication inconnue';end; + #4 : begin msg:='succès';ack:=true;end; + #5 : begin nack:=true;msg:='plus de time slot';end; + #6 : begin nack:=true;msg:='débordement tampon LI100';end; + end; + if trace and (chaineINT[i+1]=#4) then Affiche(msg,clYellow); + if trace and (chaineINT[i+1]<>#4) then Affiche(msg,clRed); + end + else + begin + if chaineINT[1]=#2 then + begin + ack:=true; + msg:='Version matérielle '+intTohex(ord(chaineINT[2]),2)+' - Version soft '+intToHex(ord(chaineINT[3]),2); + Affiche(msg,clYellow); + end + else + begin + if chaineINT[1]=#$42 then + begin + ack:=true; + delete(chaineInt,1,1); + decode_retro(ord(chaineInt[1]),ord(chaineInt[2])); + end + else + begin + if chaineINT[1]=#$61 then + begin + delete(chaineInt,1,1); + case chaineINT[1] of + #$80 : begin nack:=true;msg:='erreurs de transferts- Voir doc XpressNet p29';end; + #$81 : begin nack:=true;msg:='Station occupée - Voir doc XpressNet p29';end; + #$82 : begin nack:=true;msg:='Commande non implantée';end; + else begin nack:=true;msg:='Réception inconnue';end; + end; + Affiche(msg,clRed); + end; + end; + end; + end; + if length(chaineINT)<=3 then delete(chaineINT,i,length(chaineINT)); + end + else + begin + i:=pos(#$ff+#$fd,chaineINT); + if (i<>0) and (length(chaineINT)>=5) then + chaineINT:=decode_chaine_retro(chaineINT) + else + begin + i:=pos(#$FF+#$FD+#$81,chaineInt); + if (i<>0) and (length(chaineInt)>=6) then + begin + delete(chaineInt,i,6); + Affiche('Court circuit msg 1',clRed); + end + else + begin + affiche('Erreur 1, chaîne rétrosig. inconnue recue:'+chaine_HEX(chaineINT),clred); + chaineINT:=''; + end; + end; + end; + end; +end; + +function HexToStr(s: string) : string ; +// transforme une chaîne 0A FF CA.. en chaine d'octets +var i,long,erreur : integer; + st : string; + v : byte; +begin + long:=length(s); + st:=''; + i:=1; + repeat + val('$'+copy(s,i,2),v,erreur); + st:=st+char(v); + inc(i,3); + until (i>=long); + HexToStr:=st; +end; + +procedure connecte_USB; +begin +// initialisation de la comm USB + if avecMSCom then + begin + if NumPort<>0 then + begin + With Formprinc.Mscomm1 do + begin + Affiche('demande ouverture com'+intToSTR(nuMPort),CLYellow); + Settings:='57600,N,8,1'; + Handshaking:=2; {2=cts } + SThreshold:=1; + RThreshold:=1; + CommPort:=NumPort; + DTREnable:=false; + InputMode:=comInputModeBinary; + end; + //portCommOuvert:=false; + try + Formprinc.MSComm1.portopen:=true; + except + portCommOuvert:=false; + end; + end + else portCommOuvert:=false; + if portCommOuvert then affiche('port COM'+intToSTR(NumPort)+' ouvert',clGreen) else + Affiche('port COM'+intToSTR(NumPort)+' NON ouvert',clRed) ; + if portCommOuvert then ParUSB:=true else ParUSB:=false; + end + else + begin + PortCommOuvert:=false;ParUSB:=false; + end; +end; + +procedure deconnecte_CDM; +begin + with Formprinc do + begin + ClientSocketCDM.close; + end; +end; + +procedure connecte_CDM; +var s : string; +begin + // Initialisation de la comm socket CDM + if CDM_connecte then begin Affiche('CDM déja connecté',Cyan);exit;end; + if AdresseIPCDM<>'0' then + begin + with Formprinc do + begin + ClientSocketCDM.port:=portCDM; + ClientSocketCDM.Address:=AdresseIPCDM; + ClientSocketCDM.Open; + end; + tempo(5); + // connexion à CDM rail + s:='C-C-00-0001-CMDGEN-_CNCT|000|'; + //s:='C-C-00-0001-CMDGEN-_CNCT|019|01|LAY=CAPDEBOUHEYRE;'; + //s:='|01|LAY=CAPDEBOUHEYRE;'; + //s:='|01|LAY=RESEAU_TEST;'; + //s:='C-C-00-0001-CMDGEN-_CNCT|'+format('%.*d',[3,length(s)-1])+s; + envoi_cdm(s); + if pos('_ACK',recuCDM)<>0 then + begin + CDM_connecte:=True; + Id_CDM:=copy(recuCDM,5,2); // récupère l'ID reçu de CDM, à utiliser dans toutes les futures trames + s:='Connecté au serveur CDM rail avec l''ID='+Id_CDM; + Affiche(s,clYellow); + AfficheDebug(s,clyellow); + + // demande des services : ATNT=aiguillages, ADET=détecteurs AACT=actionneurs + s:=place_id('C-C-00-0002-RQSERV-RTSIM|030|03|SRV=ATNT;SRV=ADET;SRV=AACT;'); + envoi_CDM(s); + if pos('_ACK',recuCDM)<>0 then Affiche('Services acceptés: aiguillages - détecteurs - actionneurs',clYellow); + // demande les trains + ////s:=place_id('C-C-01-0002-DSCTRN-DLOAD|000|'); + //envoi_CDM(s); + + s:=chaine_CDM_Acc(23,2); + envoi_CDM(s); + s:=chaine_CDM_Acc(23,0); + envoi_CDM(s); + end; + end + else + begin + Affiche('La connexion a CDM n''est pas demandée car l''adresse IP est nulle dans config.cfg',cyan); + end; +end; + +{$J+} +function IsWow64Process: Boolean; +type + TIsWow64Process = function(hProcess: THandle; var Wow64Process: Boolean): Boolean; stdcall; +var + DLL: THandle; + pIsWow64Process: TIsWow64Process; +const + IsWow64: Boolean = False; +begin + IsWow64:=false; + DLL:=LoadLibrary('kernel32.dll'); + if (DLL<>0) then + begin + pIsWow64Process:=GetProcAddress(DLL,'IsWow64Process'); + if (Assigned(pIsWow64Process)) then + begin + pIsWow64Process(GetCurrentProcess,IsWow64); + end; + FreeLibrary(DLL); + end; + Result:=IsWow64; +end; +{$J-} + +procedure TFormPrinc.FormCreate(Sender: TObject); +var + i : integer; + s : string; +begin + TraceSign:=True; + Caption:=AF; + avecMSCom:=false; + Application.onHint:=doHint; + LabelEtat.Caption:='Initialisations en cours'; + Menu_interface(devalide); + + // ouvre la fenetre debug + FormDebug:=TFormDebug.Create(Application); + FormDebug.Caption:=AF+' debug'; + FormDebug.Show; + DebugOuv:=True; + + if IsWow64Process then s:='OS 64 Bits' + else s:='OS 32 Bits'; + s:=DateToStr(date)+' '+TimeToStr(Time)+' '+s; + Affiche(s,clLime);AfficheDebug(s,ClLime); + + + + NivDebug:=0; + // lecture fichier de configuration + ferme:=false; + CDM_connecte:=false; + pasreponse:=0; + lit_config; + Nbre_recu_cdm:=0; + + connecte_USB; + + AffMem:=true; + + // Initialisation de la comm socket LENZ + if AdresseIP<>'0' then + begin + ClientSocketLenz.port:=port; + ClientSocketLenz.Address:=AdresseIP; + ClientSocketLenz.Open; + end; + + connecte_CDM; + + // Initialisation des images des signaux + NbreImagePLigne:=Formprinc.ScrollBox1.Width div (largImg+5); + + // ajoute une image dynamiquement + for i:=1 to NbreFeux do + begin + cree_image(i); // et initialisation tableaux signaux + end; + + if test_leb then Tempo_init:=0 else Tempo_init:=10; // démarre les initialisation des signaux et des aiguillages dans 1 s + + NombreImages:=0; + + detect_Simule[1]:=519; + detect_Simule[2]:=517; + detect_Simule[3]:=525; + detect_Simule[4]:=528; + detect_Simule[5]:=518; + detect_Simule[6]:=514; + detect_Simule[7]:=522; + detect_Simule[8]:=527; + detect_Simule[9]:=519; + index_simule:=1; + + + //essai + // event_det[1]:=527; + // event_det[2]:=520; + // N_event_det:=2; + //aiguillage[31].Position:=2; + //aiguillage[27].Position:=2; + //traceDet:=true; + // calcul_zones; + //carre_signal(358); + //maj_feu(201); + //etat_signal_suivant(201,1); + //Aiguille_deviee(462); + //i:=detecteur_suivant(23,false,538,false); // donne l'élément suivant de AdrPrec à AdrFonc et dans Bis si c'est un aig bis + // i:=etat_signal_suivant(462,2); + //NivDebug:=3; + //Affiche(IntToSTR(detecteur_suivant_El(531,false,518,false)),clyellow); + //i:=Aiguille_deviee(176); + + +end; + + + +procedure TFormPrinc.MSComm1Comm(Sender: TObject); +var i : integer; +begin + if MSComm1.commEvent=comEvReceive then + begin + TpsRecuCom:=0; + tablo:=MSComm1.Input; + for i:=0 to length(tablo)-1 do + begin + chaine_recue:=chaine_recue+char(tablo[i]); + end; + if trace then affiche(chaine_hex(chaine_recue),clWhite); + interprete_reponse(chaine_recue); + end; +end; + +procedure TFormPrinc.FormClose(Sender: TObject; var Action: TCloseAction); +begin + Ferme:=true; + if portCommOuvert then begin portCommOuvert:=false;MSComm1.Portopen:=false; end; + portCommOuvert:=false; + ClientSocketCDM.close; + ClientSocketLenz.close; + + +end; + +procedure init_aiguillages; +var i,pos : integer; + s : string; +begin + Affiche('Positionnement aiguillages',cyan); + for i:=1 to maxaiguillage do + begin + if aiguillage[i].modele<>0 then // si l'aiguillage existe + begin + pos:=aiguillage[i].position; + s:='Init aiguillage '+intToSTR(i)+'='+intToSTR(pos); + if pos=1 then s:=s+' (dévié)' else s:=s+' (droit)'; + Affiche(s,cyan); + pilote_acc(i,pos,aig); + application.processMessages; + end; + end; + with formprinc do + begin + Menu_interface(valide); + end; + +end; + +procedure simulation; +var s : string; + adr,ts : integer; +begin + timerSimule:=timerSimule+1; + ts:=timerSimule; +{ + if timersimule=60 then + begin + trace:=true; + adr:=(513 div 8) -4 ; + s:=#$FF+#$FD+#$42+Char(adr)+#$11; + s:=checksum(s); + interprete_reponse(s); + end; +} + + //trace:=true; + if ts=60 then + begin + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=70 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=90 then + begin + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=100 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=120 then + begin + Affiche('T=120',clWhite); + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=130 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=150 then + begin + Affiche('T=150',clWhite); + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=160 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=190 then + begin + Affiche('T=190',clWhite); + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=200 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=220 then + begin + Affiche('T=220',clWhite); + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=230 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=260 then + begin + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=270 then + begin + Affiche('T=270',clWhite); + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=29 then + begin + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=30 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=32 then + begin + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=33 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + +end; + + +// timer à 100 ms +procedure TFormPrinc.Timer1Timer(Sender: TObject); +var i,a : integer; +begin + if Tempo_init>0 then dec(Tempo_init); + if Tempo_init=1 then + begin + Affiche('Positionnement des feux',clYellow); + if not(ferme) then envoi_signauxCplx; // initialisation des feux + if not(ferme) and (AvecInitAiguillages=1) then init_aiguillages else // initialisation des aiguillages + if not(ferme) then demande_etat_acc; // demande l'état des accessoires (position des aiguillages) + LabelEtat.Caption:=' '; + end; + + if temps>0 then dec(temps); + + // gestion du clignotant des feux + if tempsCli>0 then dec(tempsCli); + if tempsCli=0 then + begin + tempsCli:=5; + clignotant:=not(clignotant); + //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 + 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" + end; + end; + + // affiche la trame recue de l'interface après 500ms + if TpsRecuCom<5 then inc(TpsRecuCom); + if TpsRecuCom=5 then + begin + if trace then Affiche_chaine_hex(chaine_recue,clFuchsia); // en hexa ascii + chaine_recue:=''; + TpsRecuCom:=6; + end; + + if (not(Maj_feux_cours) and (Tempo_chgt_feux=1)) then Maj_feux(); // mise à jour des feux sur chgt aiguillage + + if (not(Maj_feux_cours) and (Tempo_chgt_feux>0)) then dec(Tempo_chgt_feux); + //simulation; + +end; + +// bouton version +procedure TFormPrinc.BoutVersionClick(Sender: TObject); +var s : string; +begin + s:=hextostr('ff fe f0'); + s:=checksum(s); + envoi(s); +end; + +// bouton de commande d'un accessoire +procedure TFormPrinc.ButtonCommandeClick(Sender: TObject); +var adr,valeur,erreur : integer; +begin + val(EditAdresse.text,adr,erreur); + val(EditVal.Text,valeur,erreur); + pilote_acc(adr,valeur,aig); +end; + +procedure TFormPrinc.EditvalEnter(Sender: TObject); +begin + if (Editval.Text<>'1') and (Editval.Text<>'2') then editval.text:='1'; +end; + +// gestion de la couleur des textes de la list box +procedure TFormPrinc.ListBox1DrawItem(Control: TWinControl; Index: Integer; + Rect: TRect; State: TOwnerDrawState); +begin + //with control as Tlistbox do + with listbox1.Canvas do + begin + Font.color:=Tcolor(ListBox1.Items.Objects[index]); + TextOut(Rect.Left,Rect.Top+4,ListBox1.Items[index]); + end; +end; + +procedure TFormPrinc.BoutonRafClick(Sender: TObject); +begin + rafraichit; +end; + +// erreur sur socket +procedure TFormPrinc.ClientSocketLenzError(Sender: TObject; + Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; + var ErrorCode: Integer); +var s : string; +begin + s:='Erreur '+IntToSTR(ErrorCode)+' socket IP Lenz'; + case ErrorCode of + 10053 : s:=s+': Connexion avortée - Timeout'; + 10054 : s:=s+': Connexion avortée par tiers'; + 10060 : s:=s+': Timeout'; + 10061 : s:=s+': Connexion refusée'; + 10065 : s:=s+': Port non connecté'; + end; + affiche(s,ClRed); + afficheDebug(s,ClRed); + parSocket:=false; + ErrorCode:=0; +end; + + +procedure TFormPrinc.ClientSocketCDMError(Sender: TObject; + Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); + var s : string; +begin + s:='Erreur '+IntToSTR(ErrorCode)+' socket IP CDM Rail'; + case ErrorCode of + 10053 : s:=s+': Connexion avortée - Timeout'; + 10054 : s:=s+': Connexion avortée par tiers'; + 10060 : s:=s+': Timeout'; + 10061 : s:=s+': Connexion refusée'; + 10065 : s:=s+': Port non connecté'; + end; + affiche(s,ClRed); + afficheDebug(s,ClRed); + parSocket:=false; + ErrorCode:=0; +end; + +// lecture depuis socket +procedure TFormPrinc.ClientSocketLenzRead(Sender: TObject; + Socket: TCustomWinSocket); +var s : string; +begin + s:=ClientSocketLenz.Socket.ReceiveText; + interprete_reponse(s); + if trace then affiche(chaine_hex(s),clWhite); +end; + +procedure TFormPrinc.ButtonTestClick(Sender: TObject); +begin + demande_etat_acc; +end; + +// procédure Event appelée si on clique sur un checkbox des images des feux +procedure TFormprinc.proc_checkBoxFB(Sender : Tobject); +var Index,adr : integer; + coche : boolean; +begin + // récupérer le contenu du Hint dans lequel on avait stocké lors de la création de la checkbox l'index du feu + { + with Sender as TcheckBox do + begin + Index:=StrToInt(hint); + coche:=checked; + end; + adr:=feux[index].adresse;} + Maj_feux ; // évalue l'état des signaux + //envoi_signauxCplx; // et affiche les signaux +end; + + +procedure TFormPrinc.ButtonInfoClick(Sender: TObject); +begin + Affiche('Ce programme pilote des signaux complexes de façon autonome ou avec CDM rail ',ClYellow); + Affiche('En fonction des détecteurs mis à 1 ou 0 par des locomotives',ClYellow); + Affiche('en circulation sur le réseau',ClYellow); + Affiche('Il est nécessaire de renseigner le fichier config.cfg',ClOrange); + Affiche('En vert : Trames envoyées à l''interface',ClWhite); + Affiche('En blanc : Trames reçues de l''interface',ClWhite); + Affiche('En violet : Trames brutes reçues de l''interface',ClWhite); + Affiche('En rouge : erreurs et défauts',ClWhite); + Affiche('En orange : pilotage des signaux',ClWhite); + Affiche('En bleu : pilotage des aiguillages',ClWhite); + Affiche('En jaune : rétrosignalisation reçue depuis l''interface',ClWhite); +end; + +procedure TFormPrinc.BoutCalcZoneClick(Sender: TObject); +var i1,i2 : integer; +begin + i1:=StrToINT(EditDetecteur1.text); + i2:=StrToINT(EditDetecteur2.text); + Event_det[1]:=i1; + Event_det[2]:=i2; + N_event_det:=2; + calcul_zones; +end; + +procedure TFormPrinc.MenuConnecterUSBClick(Sender: TObject); +begin + Hors_tension2:=false; + connecte_USB; +end; + +procedure TFormPrinc.DeconnecterUSBClick(Sender: TObject); +begin + Ferme:=true; + if portCommOuvert then begin portCommOuvert:=false;MSComm1.Portopen:=false; end; + portCommOuvert:=false; + ClientSocketLenz.close; +end; + +procedure TFormPrinc.MenuConnecterEthernetClick(Sender: TObject); +begin +if AdresseIP<>'0' then + begin + ClientSocketLenz.port:=port; + ClientSocketLenz.Address:=AdresseIP; + ClientSocketLenz.Open; + Hors_tension2:=false; + end; +end; + +procedure TFormPrinc.MenuDeconnecterEthernetClick(Sender: TObject); +begin + ClientSocketLenz.Close; +end; + + +function cde_cdm(s : string) : string; +var i : integer; +begin + i:=length(s)-1; + cde_cdm:='0'+IntToSTR(i)+s; +end; + + + +procedure TFormPrinc.locoClick(Sender: TObject); +begin + // vitesse et direction 18 pas + vitesse_loco(3,20,true); +end; + +procedure TFormPrinc.AffEtatDetecteurs(Sender: TObject); +var j,adr,NBranche : integer; + s : string; +begin + for Nbranche:=1 to NbreBranches do + begin + j:=1; + repeat + adr:=BrancheN[Nbranche,j].adresse; + + if (adr<>0) and (BrancheN[Nbranche,j].BType=1) then + begin + s:='Détecteur '+intToSTR(adr)+' = '; + if Detecteur[adr] then s:=s+'1' else s:=s+'0'; + end; + inc(j); // index de branche + until (adr=0) ; + end; + + for j:=1 to NDetecteurs do + begin + s:='Détecteur '+intToSTR(Adresse_detecteur[j])+'='; + if Detecteur[adresse_detecteur[j]] then s:=s+'1' else s:=s+'0'; + Affiche(s,clYellow); + end; +end; + +procedure TFormPrinc.Etatdesaiguillages1Click(Sender: TObject); +var i : integer; + s : string; +begin + Affiche('les positions des aiguillages BIS sont les mêmes que leurs homologues non bis',Cyan); + for i:=1 to MaxAcc do + begin + if aiguillage[i].modele<>0 then + begin + s:='Aiguillage '+IntToSTR(i)+' : '+intToSTR(aiguillage[i].position); + if aiguillage[i].position=1 then s:=s+' (dévié)' else s:=s+' (droit)'; + Affiche(s,clWhite); + end; + end; +end; + + + +procedure TFormPrinc.Codificationdesaiguillages1Click(Sender: TObject); +var i : integer ; + s : string; +begin + Affiche('Codification interne des aiguillages',Cyan); + Affiche('D=position droite S=position déviée P=pointe Z=détecteur',Cyan); + for i:=1 to MaxAiguillage do + begin + s:=IntToSTR(i); + if aiguillage[i].modele<>0 then + begin + if aiguillage[i].modele=1 then s:=s+' Pointe='; + if aiguillage[i].modele=2 then s:=s+' TJD: centre TJD='; + if aiguillage[i].modele=3 then s:=s+' TJS:'; + if aiguillage[i].modele=4 then s:=s+' Triple: Pointe='; + s:=s+IntToSTR(aiguillage[i].APointe)+aiguillage[i].APointeB+ + ' Dévie='+IntToSTR(aiguillage[i].ADevie)+aiguillage[i].ADevieB+ + ' 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); + end + else + s:=s+' absent'; + + Affiche(s,clYellow); + + end; +end; + + + +procedure TFormPrinc.ClientSocketLenzConnect(Sender: TObject; + Socket: TCustomWinSocket); +begin + Affiche('Lenz connecté ',clYellow); + AfficheDebug('Lenz connecté ',clYellow); +end; + +procedure TFormPrinc.ClientSocketCDMConnect(Sender: TObject; + Socket: TCustomWinSocket); +begin + Affiche('CDM Rail connecté ',clYellow); + AfficheDebug('CDM Rail connecté ',clYellow); + parSocketCDM:=True; +end; + +procedure TFormPrinc.ClientSocketCDMRead(Sender: TObject;Socket: TCustomWinSocket); + var i,j,k,erreur, adr,adr2,etat,etataig : integer ; + s,ss : string; + traite,sort : boolean; +begin + inc(Nbre_recu_cdm); + recuCDM:=ClientSocketCDM.Socket.ReceiveText; + + //AfficheDebug('recu de CDM:',clWhite);AfficheDebug(recuCDM,clWhite); + AckCDM:=recuCDM<>''; + if pos('ACK',recuCDM)=0 then + begin + if pos('ERR=200',recuCDM)<>0 then Affiche('Erreur CDM : réseau non chargé',clred); + end; + k:=0; + dem_calcul_zone:=false; + repeat + //Affiche('K='+intToSTR(k)+' longueur='+intToSTR(length(recuCDM)),clyellow); + //Affiche(recuCDM,clwhite); + // évènement aiguillage. Le champ AD2 n'est pas forcément présent + j:=pos('CMDACC-ST_TO',recuCDM); + if j<>0 then + begin + //Affiche(recuCDM,cllime); + i:=posEx('AD=',recuCDM,j);ss:=copy(recuCDM,i+3,10); //Affiche('j='+IntToSTR(j)+' i='+intToSTR(i),clred); + if i0 then begin Delete(recuCDM,j,i+5-j) ;end else + begin + Affiche('Erreur 95',clred); + Affiche('j='+IntToSTR(j)+' i='+intToSTR(i),clred); + Nbre_recu_cdm:=0; + Affiche(recuCDM,clred); + exit; + end; + val(ss,etat,erreur); + + // conversion en position : 1=dévié (CDM envoie 2 ou 1) 2=droit (CDM envoie 0) + if etat=0 then etatAig:=2 else etatAig:=1; + aiguillage[adr].position:=etatAig; + aiguillageB[adr].position:=etatAig; + Tempo_chgt_feux:=10; // demander la mise à jour des feux + //Affiche('Aiguillage '+intToSTR(adr)+'='+IntToStr(etatAig),clYellow); + //Affiche(recuCDM,CLOrange); + //if length(recuCDM)>80 then Affiche(copy(recuCDM,80,length(recuCDM)-80),clOrange); + end; + + + // évènement détecteur + j:=pos('CMDACC-ST_DT',recuCDM); + if j<>0 then + begin + i:=posEx('AD=',recuCDM,j);ss:=copy(recuCDM,i+3,10); + val(ss,adr,erreur); + i:=posEx('STATE=',recuCDM,j);ss:=copy(recuCDM,i+6,10); + Delete(recuCDM,j,i+5-j); + val(ss,etat,erreur); + + ancien_detecteur[adr]:=detecteur[adr]; + Detecteur[adr]:=etat=1; + detecteur_chgt:=adr; + // mise a jour du tableau evt + if ancien_detecteur[adr] and not(detecteur[adr]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=adr; + dem_calcul_zone:=true; + end; + if AfficheDet then Affiche('Détecteur '+intToSTR(adr)+'='+IntToStr(etat),clYellow); + end ; + inc(k); + //traite:=(k<30) or (pos('CMDACC-ST_TO',recuCDM)<>0) or (pos('CMDACC-ST_DT',recuCDM)<>0) ; + sort:=(k>70) or (pos('CMDACC-ST_TO',recuCDM)=0) and (pos('CMDACC-ST_DT',recuCDM)=0); + until (sort); + //Affiche('Ligne traitée'+recuCDM,clLime); + if k>=70 then begin Affiche('Erreur 90 : Longrestante='+IntToSTR(length(recuCDM)),clred); Affiche(recuCDM,clred); end; + if dem_calcul_zone then begin calcul_zones; end; + Nbre_recu_cdm:=0; +end; + + + +procedure TFormPrinc.ButtonAffDebugClick(Sender: TObject); +begin + formDebug.show; +end; + +procedure TFormPrinc.ConnecterCDMrailClick(Sender: TObject); +begin + connecte_CDM; +end; + +procedure TFormPrinc.DeconnecterCDMRailClick(Sender: TObject); +begin + deconnecte_CDM; +end; + +procedure TFormPrinc.ClientSocketCDMDisconnect(Sender: TObject; + Socket: TCustomWinSocket); +begin + Affiche('CDM rail déconnecté',Cyan); + AfficheDebug('CDM rail déconnecté',Cyan); + CDM_connecte:=False; +end; + + + +end. + diff --git a/UnitPrinc.~dfm b/UnitPrinc.~dfm new file mode 100644 index 0000000..6083d6a --- /dev/null +++ b/UnitPrinc.~dfm @@ -0,0 +1,1037 @@ +object FormPrinc: TFormPrinc + Left = 60 + Top = 304 + BorderStyle = bsSingle + Caption = 'Client TCP-IP CDM Rail ou USB - syst'#232'me LENZ' + ClientHeight = 607 + ClientWidth = 1196 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Menu = MainMenu1 + OldCreateOrder = False + Position = poDesktopCenter + ShowHint = True + OnClose = FormClose + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object Label1: TLabel + Left = 8 + Top = 8 + Width = 204 + Height = 23 + Caption = 'Signaux complexes GL' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -19 + Font.Name = 'Arial' + Font.Style = [fsItalic] + ParentFont = False + end + object LabelEtat: TLabel + Left = 312 + Top = 8 + Width = 80 + Height = 22 + Caption = 'LabelEtat' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -19 + Font.Name = 'Arial' + Font.Style = [] + ParentFont = False + end + object Image9feux: TImage + Left = 488 + Top = 0 + Width = 57 + Height = 105 + Picture.Data = { + 07544269746D6170B2160000424DB21600000000000036040000280000003200 + 00005B00000001000800000000007C120000C40E0000C40E0000000100000000 + 000000000000000080000080000000808000800000008000800080800000C0C0 + C000C0DCC000F0CAA6000020400000206000002080000020A0000020C0000020 + E00000400000004020000040400000406000004080000040A0000040C0000040 + E00000600000006020000060400000606000006080000060A0000060C0000060 + E00000800000008020000080400000806000008080000080A0000080C0000080 + E00000A0000000A0200000A0400000A0600000A0800000A0A00000A0C00000A0 + E00000C0000000C0200000C0400000C0600000C0800000C0A00000C0C00000C0 + E00000E0000000E0200000E0400000E0600000E0800000E0A00000E0C00000E0 + E00040000000400020004000400040006000400080004000A0004000C0004000 + E00040200000402020004020400040206000402080004020A0004020C0004020 + E00040400000404020004040400040406000404080004040A0004040C0004040 + E00040600000406020004060400040606000406080004060A0004060C0004060 + E00040800000408020004080400040806000408080004080A0004080C0004080 + E00040A0000040A0200040A0400040A0600040A0800040A0A00040A0C00040A0 + E00040C0000040C0200040C0400040C0600040C0800040C0A00040C0C00040C0 + E00040E0000040E0200040E0400040E0600040E0800040E0A00040E0C00040E0 + E00080000000800020008000400080006000800080008000A0008000C0008000 + E00080200000802020008020400080206000802080008020A0008020C0008020 + E00080400000804020008040400080406000804080008040A0008040C0008040 + E00080600000806020008060400080606000806080008060A0008060C0008060 + E00080800000808020008080400080806000808080008080A0008080C0008080 + E00080A0000080A0200080A0400080A0600080A0800080A0A00080A0C00080A0 + E00080C0000080C0200080C0400080C0600080C0800080C0A00080C0C00080C0 + E00080E0000080E0200080E0400080E0600080E0800080E0A00080E0C00080E0 + E000C0000000C0002000C0004000C0006000C0008000C000A000C000C000C000 + E000C0200000C0202000C0204000C0206000C0208000C020A000C020C000C020 + E000C0400000C0402000C0404000C0406000C0408000C040A000C040C000C040 + E000C0600000C0602000C0604000C0606000C0608000C060A000C060C000C060 + E000C0800000C0802000C0804000C0806000C0808000C080A000C080C000C080 + E000C0A00000C0A02000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0 + E000C0C00000C0C02000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0 + A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF + FF00F6FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000 + 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000000FFFFFFFFFFFF0000000000FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF + FFFF00000000FFFF000000000000FFFF00000000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF000000FFFF000000000000 + 00000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF0000FFFF000000FF0000000000000000000000000000FF000000FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF000000FF00 + 000000000000000000000000000000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000000000000052525252000000 + 00000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 0000000000FF000000000000525252525252000000000000FF000000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF00000000000052 + 52525252525252000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF00000000FF00000000000052525252525252520000000000 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 + FF0000000000005252525252525252000000000000FF0000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF0000000000005252525252 + 525252000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF00000000FF0000000000000052525252525200000000000000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000 + 0000000000525252520000000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000000000000000000000000000 + 0000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 00000000FF0000000000000000000000000000000000000000FF0000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF00000000000000 + 00000000000000000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF00000000FF00000000000000005252525200000000000000 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 + FF0000000000000052525252525200000000000000FF0000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF0000000000005252525252 + 525252000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF00000000FF0000000000005252525252525252000000000000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000 + 0000005252525252525252000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000000000525252525252525200 + 0000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 00000000FF0000000000000052525252525200000000000000FF0000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF00000000000000 + 00525252520000000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF00000000FF00000000000000000000000000000000000000 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 + FF0000000000000000000000000000000000000000FF0000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF0000000000000000000000 + 000000000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF00000000FF0000000000000000525252520000000000000000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000 + 0000000052525252525200000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000000000525252525252525200 + 0000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 00000000FF0000000000005252525252525252000000000000FF0000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF00000000000052 + 52525252525252000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF00000000FF00000000000052525252525252520000000000 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 + FF0000000000000052525252525200000000000000FF0000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF0000000000000000525252 + 520000000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF00000000FF0000000000000000000000000000000000000000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000 + 0000000000000000000000000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000000000000000000000000000 + 0000000000F60000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 00000000FF0000000000000000525252520000000000000000FF000000000000 + 0000000000000000000000FFF6FFFFFFFFFFFFFF00000000FF00000000000000 + 52525252525200000000000000FF000000000000000000000000000000000000 + 00FFFFFFFFFFFFFF00000000FF00000000000052525252525252520000000000 + 00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFF00000000 + FF00000000000052525252525252520000000000000000000000000000000000 + 000000000000FFFF00000000FFFFFFFF00000000FF0000000000005252525252 + 52525200000000000000000000000000000000000000000000000000FFFF0000 + 00FFFFFF00000000FF0000000000005252525252525252000000000000000000 + 000000000000000000000000000000000000FF000000FFFF00000000FF000000 + 0000000052525252525200000000000000000000000000000000000000000000 + 00000000000000FF000000FF00000000FF000000000000000052525252000000 + 00000000000000000000000000000000000000000000000000000000FF0000FF + 00000000FF000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000FF00000000000000FF00000000000000 + 0000000000000000000000000000000000000000000000000052525252000000 + 0000000000FF000000000000FF00000000000000000000000000000000000000 + 00000000000000000000000052525252525200000000000000FF000000000000 + FF00000000000000005252525200000000000000000000000000000000000052 + 52525252525252000000000000FF000000000000FF0000000000000052525252 + 5252000000000000000000000000000000000052525252525252520000000000 + 00FF000000000000FF0000000000005252525252525252000000000000000000 + 000000000000005252525252525252000000000000FF000000000000FF000000 + 0000005252525252525252000000000000000000000000000000005252525252 + 525252000000000000FF000000000000FF000000000000525252525252525200 + 0000000000000000000000000000000052525252525200000000000000FF0000 + 00000000FF000000000000525252525252525200000000000000000000000000 + 0000000000525252520000000000000000FF000000000000FF00000000000000 + 5252525252520000000000000000000000000000000000000000000000000000 + 0000000000FF000000000000FF00000000000000005252525200000000000000 + 00000000000000000000000000000000000000000000000000FF000000000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000FF000000000000FF0000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00FF000000000000FF0000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FF000000000000FF000000 + 0000000000525252520000000000000000000000000000000000000000525252 + 520000000000000000FF000000000000FF000000000000005252525252520000 + 0000000000000000000000000000000052525252525200000000000000FF0000 + 00000000FF000000000000525252525252525200000000000000000000000000 + 0000005252525252525252000000000000FF000000000000FF00000000000052 + 5252525252525200000000000000000000000000000000525252525252525200 + 0000000000FF000000000000FF00000000000052525252525252520000000000 + 00000000000000000000005252525252525252000000000000FF000000000000 + FF00000000000052525252525252520000000000000000000000000000000052 + 52525252525252000000000000FF00000000000000FF00000000000052525252 + 5252000000000000000000000000000000000000525252525252000000000000 + 00FF00000000FF0000FF00000000000000525252520000000000000000000000 + 000000000000000000525252520000000000000000FF00000000FF000000FF00 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000FF00000000FFFF000000FF000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000FF0000 + 0000FFFFFF000000FFFF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000FF00000000FFF6FFFF00000000FFFF + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000FF00000000FFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFF0000000000000000000000000000000000000000FF00000000F6FF + FFFFFFFFFF00000000000000000000000000000000000000FF00000000000000 + 00525252520000000000000000FF00000000FFF6FFFFFFFFFFFFFF0000000000 + 000000000000000000000000FF00000000000000525252525252000000000000 + 00FF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000 + FF0000000000005252525252525252000000000000FF00000000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000000000005252525252 + 525252000000000000FF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFF0000FF0000000000005252525252525252000000000000FF0000 + 0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF000000 + 0000005252525252525252000000000000FF00000000FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF000000000000005252525252520000 + 0000000000FF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFF000000FF000000000000005252525200000000000000FF0000000000FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF000000000000 + 000000000000000000000000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFF000000FF00000000000000000000000000000000FF + 000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 000000FF0000000000000000000000000000FF000000FFFF0000FFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFF000000000000 + 00000000FFFF000000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFF00000000FFFF000000000000FFFF00000000FFFFFFFF + 0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 + 00000000FFFFFFFFFFFF0000000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000 + 00FFFFFFF6FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFF0000} + Visible = False + end + object Image7feux: TImage + Left = 544 + Top = -8 + Width = 57 + Height = 105 + Picture.Data = { + 07544269746D6170DA130000424DDA1300000000000036040000280000003200 + 00004D0000000100080000000000A40F0000C40E0000C40E0000000100000000 + 000000000000000080000080000000808000800000008000800080800000C0C0 + C000C0DCC000F0CAA6000020400000206000002080000020A0000020C0000020 + E00000400000004020000040400000406000004080000040A0000040C0000040 + E00000600000006020000060400000606000006080000060A0000060C0000060 + E00000800000008020000080400000806000008080000080A0000080C0000080 + E00000A0000000A0200000A0400000A0600000A0800000A0A00000A0C00000A0 + E00000C0000000C0200000C0400000C0600000C0800000C0A00000C0C00000C0 + E00000E0000000E0200000E0400000E0600000E0800000E0A00000E0C00000E0 + E00040000000400020004000400040006000400080004000A0004000C0004000 + E00040200000402020004020400040206000402080004020A0004020C0004020 + E00040400000404020004040400040406000404080004040A0004040C0004040 + E00040600000406020004060400040606000406080004060A0004060C0004060 + E00040800000408020004080400040806000408080004080A0004080C0004080 + E00040A0000040A0200040A0400040A0600040A0800040A0A00040A0C00040A0 + E00040C0000040C0200040C0400040C0600040C0800040C0A00040C0C00040C0 + E00040E0000040E0200040E0400040E0600040E0800040E0A00040E0C00040E0 + E00080000000800020008000400080006000800080008000A0008000C0008000 + E00080200000802020008020400080206000802080008020A0008020C0008020 + E00080400000804020008040400080406000804080008040A0008040C0008040 + E00080600000806020008060400080606000806080008060A0008060C0008060 + E00080800000808020008080400080806000808080008080A0008080C0008080 + E00080A0000080A0200080A0400080A0600080A0800080A0A00080A0C00080A0 + E00080C0000080C0200080C0400080C0600080C0800080C0A00080C0C00080C0 + E00080E0000080E0200080E0400080E0600080E0800080E0A00080E0C00080E0 + E000C0000000C0002000C0004000C0006000C0008000C000A000C000C000C000 + E000C0200000C0202000C0204000C0206000C0208000C020A000C020C000C020 + E000C0400000C0402000C0404000C0406000C0408000C040A000C040C000C040 + E000C0600000C0602000C0604000C0606000C0608000C060A000C060C000C060 + E000C0800000C0802000C0804000C0806000C0808000C080A000C080C000C080 + E000C0A00000C0A02000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0 + E000C0C00000C0C02000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0 + A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF + FF00FFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000 + 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000000FFFFFFFFFFFF0000000000FF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF + FFFF00000000FFFF000000000000FFFF00000000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF000000FFFF000000000000 + 00000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF0000FFFF000000FF0000000000000000000000000000FF000000FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF000000FF00 + 000000000000000000000000000000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000000000000052525252000000 + 00000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 0000000000FF000000000000525252525252000000000000FF000000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF00000000000052 + 52525252525252000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF00000000FF00000000000052525252525252520000000000 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 + FF0000000000005252525252525252000000000000FF0000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF0000000000005252525252 + 525252000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF00000000FF0000000000000052525252525200000000000000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000 + 0000000000525B52520000000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000000000000000000000000000 + 0000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 00000000FF0000000000000000000000000000000000000000FF0000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF00000000000000 + 00000000000000000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF00000000FF00000000000000005252525200000000000000 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 + FF0000000000000052525252525200000000000000FF0000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF0000000000005252525252 + 525252000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF00000000FF0000000000005252525252525252000000000000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000 + 0000005252525252525252000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000000000525252525252525200 + 0000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 00000000FF00000000000000525B5252525200000000000000FF0000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF00000000000000 + 00525252520000000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF00000000FF00000000000000000000000000000000000000 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 + FF0000000000000000000000000000000000000000FF0000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF0000000000000000000000 + 000000000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF00000000FF0000000000000000525252520000000000000000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000 + 0000000052525252525200000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000000000525252525252525200 + 0000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 00000000FF0000000000005252525252525252000000000000FF0000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF00000000000052 + 52525252525252000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF00000000FF00000000000052525252525252520000000000 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 + FF0000000000000052525252525200000000000000FF0000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF0000000000000000525252 + 520000000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF00000000FF0000000000000000000000000000000000000000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000 + 0000000000000000000000000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000000000000000000000000000 + 0000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 00000000FF0000000000000000525252520000000000000000FF0000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF00000000000000 + 525B5252525200000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF00000000FF00000000000052525252525252520000000000 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 + FF0000000000005252525252525252000000000000FF0000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF0000000000005252525252 + 525252000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF00000000FF0000000000005252525252525252000000000000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000 + 0000000052525252525200000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000000000000052525252000000 + 0000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 00000000FF0000000000000000000000000000000000000000FF0000FFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF00000000000000 + 00000000000000000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFF00000000FF00000000000000000000000000000000000000 + 00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000 + FF0000000000000000525252520000000000000000FF0000FFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF0000000000000052525252 + 525200000000000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFF00000000FF0000000000005252525252525252000000000000FF0000 + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF000000 + 0000005252525252525252000000000000FF0000000000000000000000000000 + 000000FFFFFFFFFFFFFFFFFF00000000FF000000000000525252525252525200 + 0000000000FF00000000000000000000000000000000000000FFFFFFFFFFFFF6 + 00000000FF0000000000005252525252525252000000000000FFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFF00000000FF00000000000000 + 525252525252000000000000000000000000000000000000000000000000FFFF + 00000000FFFFFFF600000000FF00000000000000005252525200000000000000 + 0000000000000000000000000000000000000000FFFF000000FFFFFF00000000 + FF00000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000FF000000FFFF00000000FF0000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000FF + 000000FF00000000FF0000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000FF0000FF00000000FF000000 + 0000000000525252520000000000000000000000000000000000000000525252 + 5200000000000000FF00000000000000FF000000000000005252525252520000 + 0000000000000000000000000000000052525252525200000000000000FF0000 + 00000000FF000000000000525252525252525200000000000000000000000000 + 0000005252525252525252000000000000FF000000000000FF00000000000052 + 5252525252525200000000000000000000000000000000525252525252525200 + 0000000000FF000000000000FF00000000000052525252525252520000000000 + 00000000000000000000005252525252525252000000000000FF000000000000 + FF00000000000052525252525252520000000000000000000000000000000052 + 52525252525252000000000000FF00000000000000FF00000000000052525252 + 5252000000000000000000000000000000000000525252525252000000000000 + FF0000000000FF0000FF00000000000000525252520000000000000000000000 + 0000000000000000005252525200000000000000FF0000FF0000FF000000FF00 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000FF000000FF0000FFFF000000FF000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FF000000FFFF + 0000FFFFFF000000FFFF00000000000000000000000000000000000000000000 + 000000000000000000000000FFFF000000FFFFFF0000FFFFFFFF00000000FFFF + 000000000000000000000000000000000000000000000000000000000000FFFF + 00000000FFFFFFFF0000FFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFF0000FFFF + FFFFFFF6FF000000000000000000000000000000000000000000000000000000 + 000000000000000000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000000000 + 000000000000000000000000000000000000000000000000000000FFFFFFFFFF + FFFFF6FF0000} + Visible = False + end + object Image5feux: TImage + Left = 288 + Top = 0 + Width = 41 + Height = 89 + Picture.Data = { + 07544269746D61706E0B0000424D6E0B00000000000036040000280000001A00 + 000042000000010008000000000038070000C40E0000C40E0000000100000000 + 000000000000000080000080000000808000800000008000800080800000C0C0 + C000C0DCC000F0CAA6000020400000206000002080000020A0000020C0000020 + E00000400000004020000040400000406000004080000040A0000040C0000040 + E00000600000006020000060400000606000006080000060A0000060C0000060 + E00000800000008020000080400000806000008080000080A0000080C0000080 + E00000A0000000A0200000A0400000A0600000A0800000A0A00000A0C00000A0 + E00000C0000000C0200000C0400000C0600000C0800000C0A00000C0C00000C0 + E00000E0000000E0200000E0400000E0600000E0800000E0A00000E0C00000E0 + E00040000000400020004000400040006000400080004000A0004000C0004000 + E00040200000402020004020400040206000402080004020A0004020C0004020 + E00040400000404020004040400040406000404080004040A0004040C0004040 + E00040600000406020004060400040606000406080004060A0004060C0004060 + E00040800000408020004080400040806000408080004080A0004080C0004080 + E00040A0000040A0200040A0400040A0600040A0800040A0A00040A0C00040A0 + E00040C0000040C0200040C0400040C0600040C0800040C0A00040C0C00040C0 + E00040E0000040E0200040E0400040E0600040E0800040E0A00040E0C00040E0 + E00080000000800020008000400080006000800080008000A0008000C0008000 + E00080200000802020008020400080206000802080008020A0008020C0008020 + E00080400000804020008040400080406000804080008040A0008040C0008040 + E00080600000806020008060400080606000806080008060A0008060C0008060 + E00080800000808020008080400080806000808080008080A0008080C0008080 + E00080A0000080A0200080A0400080A0600080A0800080A0A00080A0C00080A0 + E00080C0000080C0200080C0400080C0600080C0800080C0A00080C0C00080C0 + E00080E0000080E0200080E0400080E0600080E0800080E0A00080E0C00080E0 + E000C0000000C0002000C0004000C0006000C0008000C000A000C000C000C000 + E000C0200000C0202000C0204000C0206000C0208000C020A000C020C000C020 + E000C0400000C0402000C0404000C0406000C0408000C040A000C040C000C040 + E000C0600000C0602000C0604000C0606000C0608000C060A000C060C000C060 + E000C0800000C0802000C0804000C0806000C0808000C080A000C080C000C080 + E000C0A00000C0A02000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0 + E000C0C00000C0C02000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0 + A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF + FF00FFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFF0000FFFF + FFFFFFFFFF000000000000000000000000FFFFFFFFFFFFFF0000FFFFFFFFFF00 + 00000000FFFFFFFFFFFF0000000000FFF6FFFFFF0000FFFFFFFF00000000FFFF + 000000000000FFFF00000000F6FFFFFF0000FFFFFF000000FFFF000000000000 + 00000000FFFF000000FFFFF60000FFFF000000FF000000000000000000000000 + 0000FF000000FFFF0000FF000000FF00000000000000000000000000000000FF + 000000FF0000FF0000FF000000000000005252525200000000000000FF0000FF + 0000000000FF000000000000525252525252000000000000FF00000000000000 + FF0000000000005252525252525252000000000000FF000000000000FF000000 + 0000005252525252525252000000000000FF000000000000FF00000000000052 + 52525252525252000000000000FF000000000000FF0000000000005252525252 + 525252000000000000FF000000000000FF000000000000005252525252520000 + 0000000000FF000000000000FF00000000000000005252525200000000000000 + 00FF000000000000FF0000000000000000000000000000000000000000FF0000 + 00000000FF0000000000000000000000000000000000000000FF000000000000 + FF0000000000000000000000000000000000000000FF000000000000FF000000 + 0000000000525252520000000000000000FF000000000000FF00000000000000 + 52525252525200000000000000FF000000000000FF0000000000005252525252 + 525252000000000000FF000000000000FF000000000000525252525252525200 + 0000000000FF000000000000FF000000000000525252525B5252520000000000 + 00FF000000000000FF0000000000005252525252525252000000000000FF0000 + 00000000FF00000000000000525252525B5200000000000000FF000000000000 + FF0000000000000000525252520000000000000000FF000000000000FF000000 + 0000000000000000000000000000000000FF000000000000FF00000000000000 + 00000000000000000000000000FF000000000000FF0000000000000000000000 + 000000000000000000FF000000000000FF000000000000000052525252000000 + 0000000000FF000000000000FF00000000000000525252525252000000000000 + 00FF000000000000FF0000000000005252525252525252000000000000FF0000 + 00000000FF0000000000005252525252525252000000000000FF000000000000 + FF0000000000005252525252525252000000000000FF000000000000FF000000 + 00000052525252525B5252000000000000FF000000000000FF00000000000000 + 52525252525200000000000000FF000000000000FF0000000000000000525252 + 520000000000000000FF000000000000FF000000000000000000000000000000 + 0000000000FF000000000000FF00000000000000000000000000000000000000 + 00FF000000000000FF0000000000000000000000000000000000000000FF0000 + 00000000FF0000000000000000525252520000000000000000FF000000000000 + FF0000000000000052525252525200000000000000FF000000000000FF000000 + 0000005252525252525252000000000000FF000000000000FF00000000000052 + 52525252525252000000000000FF000000000000FF0000000000005252525252 + 525252000000000000FF000000000000FF000000000000525252525252525200 + 0000000000FF000000000000FF00000000000000525252525252000000000000 + 00FF000000000000FF0000000000000000525252520000000000000000FF0000 + 00000000FF0000000000000000000000000000000000000000FF000000000000 + FF0000000000000000000000000000000000000000FF000000000000FF000000 + 0000000000000000000000000000000000FF000000000000FF00000000000000 + 00525252520000000000000000FF000000000000FF0000000000000052525252 + 525200000000000000FF000000000000FF0000000000005252525B5252525200 + 0000000000FF000000000000FF00000000000052525252525252520000000000 + 00FF000000000000FF0000000000005B52525252525252000000000000FF0000 + 00000000FF0000000000005252525252525252000000000000FF000000000000 + 00FF000000000000525252525252000000000000F60000000000FF0000FF0000 + 00000000005252525200000000000000FF0000FF0000FF000000FF0000000000 + 0000000000000000000000FF000000FF0000FFFF000000FF0000000000000000 + 000000000000FF000000FFFF0000FFFFFF000000FFFF00000000000000000000 + FFFF000000FFFFFF0000FFFFFFFF00000000FFFF000000000000FFFF00000000 + FFFFFFFF0000FFFFFFFFFF0000000000FFFFFFFFFFFF0000000000FFF6FFFFFF + 0000FFFFFFFFFFFFFF000000000000000000000000FFFFFFFFFFFFFF0000F6FF + FFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFF0000} + Visible = False + end + object Image4feux: TImage + Left = 248 + Top = 0 + Width = 41 + Height = 97 + Picture.Data = { + 07544269746D6170720A0000424D720A00000000000036040000280000001A00 + 00003900000001000800000000003C060000C40E0000C40E0000000100000000 + 000000000000000080000080000000808000800000008000800080800000C0C0 + C000C0DCC000F0CAA6000020400000206000002080000020A0000020C0000020 + E00000400000004020000040400000406000004080000040A0000040C0000040 + E00000600000006020000060400000606000006080000060A0000060C0000060 + E00000800000008020000080400000806000008080000080A0000080C0000080 + E00000A0000000A0200000A0400000A0600000A0800000A0A00000A0C00000A0 + E00000C0000000C0200000C0400000C0600000C0800000C0A00000C0C00000C0 + E00000E0000000E0200000E0400000E0600000E0800000E0A00000E0C00000E0 + E00040000000400020004000400040006000400080004000A0004000C0004000 + E00040200000402020004020400040206000402080004020A0004020C0004020 + E00040400000404020004040400040406000404080004040A0004040C0004040 + E00040600000406020004060400040606000406080004060A0004060C0004060 + E00040800000408020004080400040806000408080004080A0004080C0004080 + E00040A0000040A0200040A0400040A0600040A0800040A0A00040A0C00040A0 + E00040C0000040C0200040C0400040C0600040C0800040C0A00040C0C00040C0 + E00040E0000040E0200040E0400040E0600040E0800040E0A00040E0C00040E0 + E00080000000800020008000400080006000800080008000A0008000C0008000 + E00080200000802020008020400080206000802080008020A0008020C0008020 + E00080400000804020008040400080406000804080008040A0008040C0008040 + E00080600000806020008060400080606000806080008060A0008060C0008060 + E00080800000808020008080400080806000808080008080A0008080C0008080 + E00080A0000080A0200080A0400080A0600080A0800080A0A00080A0C00080A0 + E00080C0000080C0200080C0400080C0600080C0800080C0A00080C0C00080C0 + E00080E0000080E0200080E0400080E0600080E0800080E0A00080E0C00080E0 + E000C0000000C0002000C0004000C0006000C0008000C000A000C000C000C000 + E000C0200000C0202000C0204000C0206000C0208000C020A000C020C000C020 + E000C0400000C0402000C0404000C0406000C0408000C040A000C040C000C040 + E000C0600000C0602000C0604000C0606000C0608000C060A000C060C000C060 + E000C0800000C0802000C0804000C0806000C0808000C080A000C080C000C080 + E000C0A00000C0A02000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0 + E000C0C00000C0C02000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0 + A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF + FF00FFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFF6FFFF0000FFFF + FFFFFFFFFF000000000000000000000000FFFFFFFFFFFFFF0000FFFFFFFFFF00 + 00000000FFFFFFFFFFFF0000000000FFFFFFFFFF0000FFFFFFFF00000000FFFF + 000000000000FFFF00000000FFFFFFFF0000FFFFFF000000FFFF000000000000 + 00000000FFFF000000FFFFFF0000FFFF000000FF000000000000000000000000 + 0000FF000000FFFF0000FF000000FF00000000000000000000000000000000FF + 000000FF0000FF0000FF000000000000005252525200000000000000FF0000FF + 0000000000FF000000000000525252525252000000000000FF00000000000000 + FF0000000000005252525252525252000000000000FF000000000000FF000000 + 0000005252525252525252000000000000FF000000000000FF00000000000052 + 52525252525252000000000000FF000000000000FF0000000000005252525252 + 525252000000000000FF000000000000FF000000000000005252525252520000 + 0000000000FF000000000000FF00000000000000005252525200000000000000 + 00FF000000000000FF0000000000000000000000000000000000000000FF0000 + 00000000FF0000000000000000000000000000000000000000FF000000000000 + FF0000000000000000000000000000000000000000FF000000000000FF000000 + 0000000000525252520000000000000000FF000000000000FF00000000000000 + 52525252525200000000000000FF000000000000FF0000000000005252525252 + 525252000000000000FF000000000000FF000000000000525252525252525200 + 0000000000FF000000000000FF00000000000052525252525252520000000000 + 00FF000000000000FF0000000000005252525252525252000000000000FF0000 + 00000000FF0000000000000052525252525200000000000000FF000000000000 + FF0000000000000000525252520000000000000000FF000000000000FF000000 + 0000000000000000000000000000000000FF000000000000FF00000000000000 + 00000000000000000000000000FF000000000000FF0000000000000000000000 + 000000000000000000FF000000000000FF000000000000000052525252000000 + 0000000000FF000000000000FF00000000000000525252525252000000000000 + 00FF000000000000FF0000000000005252525252525252000000000000FF0000 + 00000000FF0000000000005252525252525252000000000000FF000000000000 + FF0000000000005252525252525252000000000000FF000000000000FF000000 + 0000005252525252525252000000000000FF000000000000FF00000000000000 + 52525252525200000000000000FF000000000000FF0000000000000000525252 + 520000000000000000FF000000000000FF000000000000000000000000000000 + 0000000000FF000000000000FF00000000000000000000000000000000000000 + 00FF000000000000FF0000000000000000000000000000000000000000FF0000 + 00000000FF0000000000000000000000000000000000000000FF000000000000 + FF0000000000000000000000000000000000000000FF000000000000FF000000 + 0000000000525252520000000000000000FF000000000000FF00000000000000 + 52525252525200000000000000FF000000000000FF0000000000005252525252 + 525252000000000000FF000000000000FF000000000000525252525252525200 + 0000000000FF000000000000FF00000000000052525252525252520000000000 + 00FF000000000000FF0000000000005252525252525252000000000000FF0000 + 0000000000FF000000000000525252525252000000000000FF0000000000FF00 + 00FF000000000000005252525200000000000000FF0000FF0000FF000000FF00 + 000000000000000000000000000000FF000000FF0000FFFF000000FF00000000 + 00000000000000000000FF000000FFFF0000FFFFFF000000FFFF000000000000 + 00000000FFFF000000FFFFFF0000FFFFFFFF00000000FFFF000000000000FFFF + 00000000FFFFFFFF0000FFFFFFFFFF0000000000FFFFFFFFFFFF0000000000FF + FFFFFFFF0000FFFFFFFFFFFFFF000000000000000000000000FFFFFFFFFFFFFF + 0000FFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFF6FFFF0000} + Visible = False + end + object Image3feux: TImage + Left = 600 + Top = 0 + Width = 49 + Height = 105 + Picture.Data = { + 07544269746D617006090000424D060900000000000036040000280000001A00 + 00002C0000000100080000000000D0040000C40E0000C40E0000000100000000 + 000000000000000080000080000000808000800000008000800080800000C0C0 + C000C0DCC000F0CAA6000020400000206000002080000020A0000020C0000020 + E00000400000004020000040400000406000004080000040A0000040C0000040 + E00000600000006020000060400000606000006080000060A0000060C0000060 + E00000800000008020000080400000806000008080000080A0000080C0000080 + E00000A0000000A0200000A0400000A0600000A0800000A0A00000A0C00000A0 + E00000C0000000C0200000C0400000C0600000C0800000C0A00000C0C00000C0 + E00000E0000000E0200000E0400000E0600000E0800000E0A00000E0C00000E0 + E00040000000400020004000400040006000400080004000A0004000C0004000 + E00040200000402020004020400040206000402080004020A0004020C0004020 + E00040400000404020004040400040406000404080004040A0004040C0004040 + E00040600000406020004060400040606000406080004060A0004060C0004060 + E00040800000408020004080400040806000408080004080A0004080C0004080 + E00040A0000040A0200040A0400040A0600040A0800040A0A00040A0C00040A0 + E00040C0000040C0200040C0400040C0600040C0800040C0A00040C0C00040C0 + E00040E0000040E0200040E0400040E0600040E0800040E0A00040E0C00040E0 + E00080000000800020008000400080006000800080008000A0008000C0008000 + E00080200000802020008020400080206000802080008020A0008020C0008020 + E00080400000804020008040400080406000804080008040A0008040C0008040 + E00080600000806020008060400080606000806080008060A0008060C0008060 + E00080800000808020008080400080806000808080008080A0008080C0008080 + E00080A0000080A0200080A0400080A0600080A0800080A0A00080A0C00080A0 + E00080C0000080C0200080C0400080C0600080C0800080C0A00080C0C00080C0 + E00080E0000080E0200080E0400080E0600080E0800080E0A00080E0C00080E0 + E000C0000000C0002000C0004000C0006000C0008000C000A000C000C000C000 + E000C0200000C0202000C0204000C0206000C0208000C020A000C020C000C020 + E000C0400000C0402000C0404000C0406000C0408000C040A000C040C000C040 + E000C0600000C0602000C0604000C0606000C0608000C060A000C060C000C060 + E000C0800000C0802000C0804000C0806000C0808000C080A000C080C000C080 + E000C0A00000C0A02000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0 + E000C0C00000C0C02000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0 + A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF + FF00FFFFFFFFFFFFFFFFFF0000000000000000FFFFFFF6FFFFFFFFFF0000FFFF + FFFFFFFFFF000000000000000000000000FFFFFFFFFFFFFF0000FFFFFFFFFF00 + 00000000FFFFFFFFFFFF0000000000FFFFFFFFFF0000FFFFFFFF00000000FFFF + 000000000000FFFF00000000FFFFFFFF0000FFFFFF000000FFFF000000000000 + 00000000FFFF000000FFFFFF0000FFFF000000FF000000000000000000000000 + 0000FF000000FFFF0000F6000000FF00000000000000000000000000000000FF + 000000FF0000FF0000FF000000000000005252525200000000000000FF0000FF + 0000000000FF000000000000525252525252000000000000FF00000000000000 + FF0000000000005252525252525252000000000000FF000000000000FF000000 + 0000005252525252525252000000000000FF000000000000FF00000000000052 + 52525252525252000000000000FF000000000000FF0000000000005252525252 + 525252000000000000FF000000000000FF000000000000005252525252520000 + 0000000000FF000000000000FF00000000000000005252525200000000000000 + 00FF000000000000FF0000000000000000000000000000000000000000FF0000 + 00000000FF0000000000000000000000000000000000000000FF000000000000 + FF0000000000000000000000000000000000000000FF000000000000FF000000 + 0000000000525252520000000000000000FF000000000000FF00000000000000 + 52525252525200000000000000FF000000000000FF0000000000005252525252 + 525252000000000000FF000000000000FF000000000000525252525252525200 + 0000000000FF000000000000FF00000000000052525252525252520000000000 + 00FF000000000000FF0000000000005252525252525252000000000000FF0000 + 00000000FF0000000000000052525252525200000000000000FF000000000000 + FF0000000000000000525252520000000000000000FF000000000000FF000000 + 0000000000000000000000000000000000FF000000000000FF00000000000000 + 00000000000000000000000000FF000000000000FF0000000000000000000000 + 000000000000000000FF000000000000FF000000000000000052525252000000 + 0000000000FF000000000000FF00000000000000525252525252000000000000 + 00FF000000000000FF0000000000005252525252525252000000000000FF0000 + 00000000FF0000000000005252525252525252000000000000FF000000000000 + FF0000000000005252525252525252000000000000FF000000000000FF000000 + 0000005252525252525252000000000000FF00000000000000FF000000000000 + 525252525252000000000000FF0000000000FF0000FF00000000000000525252 + 5200000000000000FF0000FF0000FF000000F600000000000000000000000000 + 000000FF000000FF0000FFFF000000FF0000000000000000000000000000FF00 + 0000FFFF0000FFFFFF000000FFFF00000000000000000000FFFF000000FFFFFF + 0000FFFFFFFF00000000FFFF000000000000FFFF00000000FFFFFFFF0000FFFF + FFFFFF0000000000FFFFFFFFFFFF0000000000FFFFFFFFF60000FFFFFFFFFFFF + FF000000000000000000000000FFFFFFFFFFFFFF0000FFF6FFFFFFFFFFFFFF00 + 00000000000000FFFFFFFFFFFFFFFFFF0000} + Visible = False + end + object Image2feux: TImage + Left = 656 + Top = 0 + Width = 33 + Height = 57 + Picture.Data = { + 07544269746D617026080000424D260800000000000036040000280000001A00 + 0000240000000100080000000000F0030000C40E0000C40E0000000100000000 + 000000000000000080000080000000808000800000008000800080800000C0C0 + C000C0DCC000F0CAA6000020400000206000002080000020A0000020C0000020 + E00000400000004020000040400000406000004080000040A0000040C0000040 + E00000600000006020000060400000606000006080000060A0000060C0000060 + E00000800000008020000080400000806000008080000080A0000080C0000080 + E00000A0000000A0200000A0400000A0600000A0800000A0A00000A0C00000A0 + E00000C0000000C0200000C0400000C0600000C0800000C0A00000C0C00000C0 + E00000E0000000E0200000E0400000E0600000E0800000E0A00000E0C00000E0 + E00040000000400020004000400040006000400080004000A0004000C0004000 + E00040200000402020004020400040206000402080004020A0004020C0004020 + E00040400000404020004040400040406000404080004040A0004040C0004040 + E00040600000406020004060400040606000406080004060A0004060C0004060 + E00040800000408020004080400040806000408080004080A0004080C0004080 + E00040A0000040A0200040A0400040A0600040A0800040A0A00040A0C00040A0 + E00040C0000040C0200040C0400040C0600040C0800040C0A00040C0C00040C0 + E00040E0000040E0200040E0400040E0600040E0800040E0A00040E0C00040E0 + E00080000000800020008000400080006000800080008000A0008000C0008000 + E00080200000802020008020400080206000802080008020A0008020C0008020 + E00080400000804020008040400080406000804080008040A0008040C0008040 + E00080600000806020008060400080606000806080008060A0008060C0008060 + E00080800000808020008080400080806000808080008080A0008080C0008080 + E00080A0000080A0200080A0400080A0600080A0800080A0A00080A0C00080A0 + E00080C0000080C0200080C0400080C0600080C0800080C0A00080C0C00080C0 + E00080E0000080E0200080E0400080E0600080E0800080E0A00080E0C00080E0 + E000C0000000C0002000C0004000C0006000C0008000C000A000C000C000C000 + E000C0200000C0202000C0204000C0206000C0208000C020A000C020C000C020 + E000C0400000C0402000C0404000C0406000C0408000C040A000C040C000C040 + E000C0600000C0602000C0604000C0606000C0608000C060A000C060C000C060 + E000C0800000C0802000C0804000C0806000C0808000C080A000C080C000C080 + E000C0A00000C0A02000C0A04000C0A06000C0A08000C0A0A000C0A0C000C0A0 + E000C0C00000C0C02000C0C04000C0C06000C0C08000C0C0A000F0FBFF00A4A0 + A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF + FF00FFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFF0000FFFF + FFFFFFFFFF000000000000000000000000FFFFFFFFFFFFFF0000FFFFFFFFFF00 + 00000000FFFFFFFFFFFF0000000000FFFFFFFFFF0000FFFFFFFF00000000FFFF + 000000000000FFFF00000000FFFFFFFF0000FFFFFF000000FFFF000000000000 + 00000000FFFF000000FFFFFF0000FFFF000000FF000000000000000000000000 + 0000FF000000FFFF0000FF000000FF00000000000000000000000000000000FF + 000000FF0000FF0000FF000000000000005252525200000000000000FF0000FF + 0000000000FF000000000000525252525252000000000000FF00000000000000 + FF0000000000005252525252525252000000000000FF000000000000FF000000 + 0000005252525252525252000000000000FF000000000000FF00000000000052 + 52525252525252000000000000FF000000000000FF0000000000005252525252 + 525252000000000000FF000000000000FF000000000000005252525252520000 + 0000000000FF000000000000FF00000000000000005252525200000000000000 + 00FF000000000000FF0000000000000000000000000000000000000000FF0000 + 00000000FF0000000000000000000000000000000000000000FF000000000000 + FF0000000000000000000000000000000000000000FF000000000000FF000000 + 0000000000000000000000000000000000FF000000000000FF00000000000000 + 00000000000000000000000000FF000000000000FF0000000000000000000000 + 000000000000000000FF000000000000FF000000000000000052525252000000 + 0000000000FF000000000000FF00000000000000525252525252000000000000 + 00FF000000000000FF0000000000005252525252525252000000000000FF0000 + 00000000FF0000000000005252525252525252000000000000FF000000000000 + FF0000000000005252525252525252000000000000FF000000000000FF000000 + 0000005252525252525252000000000000FF00000000000000FF000000000000 + 525252525252000000000000FF0000000000FF0000FF00000000000000525252 + 5200000000000000FF0000FF0000FF000000FF00000000000000000000000000 + 000000FF000000FF0000FFFF000000FF0000000000000000000000000000FF00 + 0000FFFF0000FFFFFF000000FFFF00000000000000000000FFFF000000FFFFFF + 0000FFFFFFFF00000000FFFF000000000000FFFF00000000FFFFFFFF0000FFFF + FFFFFF0000000000FFFFFFFFF6FF0000000000FFFFFFFFFF0000F6FFFFFFFFFF + FF000000000000000000000000FFF6FFFFFFFFFF0000FFFFFFFFFFFFFFFFFF00 + 00000000000000FFFFFFFFFFFFFFFFFF0000} + Visible = False + end + object BoutVersion: TButton + Left = 705 + Top = 10 + Width = 74 + Height = 25 + Caption = 'Dem version' + TabOrder = 0 + OnClick = BoutVersionClick + end + object ListBox1: TListBox + Left = 8 + Top = 40 + Width = 681 + Height = 520 + Style = lbOwnerDrawFixed + Color = clBlack + Font.Charset = ANSI_CHARSET + Font.Color = clBlue + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [] + ItemHeight = 16 + ParentFont = False + TabOrder = 1 + OnDrawItem = ListBox1DrawItem + end + object BoutonRaf: TButton + Left = 968 + Top = 64 + Width = 105 + Height = 33 + Caption = 'Rafraichissement' + TabOrder = 2 + OnClick = BoutonRafClick + end + object ScrollBox1: TScrollBox + Left = 704 + Top = 164 + Width = 465 + Height = 401 + TabOrder = 3 + end + object GroupBox1: TGroupBox + Left = 704 + Top = 40 + Width = 249 + Height = 65 + Caption = 'Commande d'#39'accessoires' + TabOrder = 4 + object Label2: TLabel + Left = 7 + Top = 16 + Width = 58 + Height = 13 + Caption = 'adresse acc' + end + object Label3: TLabel + Left = 75 + Top = 16 + Width = 30 + Height = 13 + Caption = '1 ou 2' + end + object Label4: TLabel + Left = 133 + Top = 10 + Width = 85 + Height = 13 + Caption = '1=d'#233'vi'#233' 2=droit' + end + object EditAdresse: TEdit + Left = 8 + Top = 32 + Width = 57 + Height = 21 + TabOrder = 0 + Text = '1' + end + object Editval: TEdit + Left = 72 + Top = 32 + Width = 41 + Height = 21 + TabOrder = 1 + Text = '1' + OnEnter = EditvalEnter + end + object ButtonCommande: TButton + Left = 124 + Top = 24 + Width = 109 + Height = 33 + Caption = 'Envoi commande' + TabOrder = 2 + WordWrap = True + OnClick = ButtonCommandeClick + end + end + object ButtonTest: TButton + Left = 864 + Top = 8 + Width = 105 + Height = 33 + Caption = 'Demande '#233'tat de la r'#233'trosignalisation' + TabOrder = 5 + WordWrap = True + OnClick = ButtonTestClick + end + object ButtonInfo: TButton + Left = 1080 + Top = 72 + Width = 75 + Height = 25 + Caption = 'Informations' + TabOrder = 7 + OnClick = ButtonInfoClick + end + object GroupBox2: TGroupBox + Left = 702 + Top = 111 + Width = 419 + Height = 46 + Caption = 'Test d'#233'tecteur /feu suivant / pr'#233'c'#233'dent' + TabOrder = 6 + object LabelDetSP: TLabel + Left = 356 + Top = 20 + Width = 52 + Height = 18 + AutoSize = False + Caption = '0' + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Arial' + Font.Style = [] + ParentFont = False + end + object EditDetecteur1: TEdit + Left = 13 + Top = 20 + Width = 44 + Height = 21 + TabOrder = 0 + Text = '0' + end + object BoutCalcZone: TButton + Left = 160 + Top = 20 + Width = 105 + Height = 20 + Caption = 'calcule zone suivante' + TabOrder = 2 + OnClick = BoutCalcZoneClick + end + object EditDetecteur2: TEdit + Left = 69 + Top = 20 + Width = 44 + Height = 21 + TabOrder = 1 + Text = '0' + end + end + object StatusBar1: TStatusBar + Left = 0 + Top = 577 + Width = 1196 + Height = 30 + Panels = <> + SimplePanel = True + end + object MSComm1: TMSComm + Left = 1120 + Top = 8 + Width = 32 + Height = 32 + OnComm = MSComm1Comm + ControlData = { + 2143341208000000ED030000ED03000001568A64000006000000010000040000 + 00020000802500000000080000000000000000003F00000001000000} + end + object loco: TButton + Left = 976 + Top = 10 + Width = 75 + Height = 25 + Caption = 'loco' + TabOrder = 10 + OnClick = locoClick + end + object ButtonAffDebug: TButton + Left = 784 + Top = 10 + Width = 75 + Height = 25 + Caption = 'Affiche debug' + TabOrder = 11 + OnClick = ButtonAffDebugClick + end + object Timer1: TTimer + Interval = 100 + OnTimer = Timer1Timer + Left = 1072 + Top = 8 + end + object ClientSocketLenz: TClientSocket + Active = False + ClientType = ctNonBlocking + Port = 0 + OnConnect = ClientSocketLenzConnect + OnRead = ClientSocketLenzRead + OnError = ClientSocketLenzError + Left = 408 + end + object MainMenu1: TMainMenu + Left = 216 + Top = 8 + object Afficher1: TMenuItem + Caption = 'Afficher' + object Etatdesdtecteurs1: TMenuItem + Caption = 'Etat des d'#233'tecteurs' + OnClick = AffEtatDetecteurs + end + object Etatdesaiguillages1: TMenuItem + Caption = 'Etat des aiguillages' + OnClick = Etatdesaiguillages1Click + end + object N3: TMenuItem + Caption = '-' + end + object Codificationdesaiguillages1: TMenuItem + Caption = 'Codification des aiguillages' + OnClick = Codificationdesaiguillages1Click + end + end + object Interface1: TMenuItem + Caption = 'Interface' + object MenuConnecterUSB: TMenuItem + Caption = 'Connecter USB' + Hint = 'Connecter l'#39'interface en USB' + OnClick = MenuConnecterUSBClick + end + object DeconnecterUSB: TMenuItem + Caption = 'D'#233'connecter USB' + Hint = 'D'#233'connecter l'#39'interface USB' + OnClick = DeconnecterUSBClick + end + object N2: TMenuItem + Caption = '-' + end + object MenuConnecterEthernet: TMenuItem + Caption = 'Connecter Ethernet' + Hint = 'Connecter l'#39'interface par Ethernet' + OnClick = MenuConnecterEthernetClick + end + object MenuDeconnecterEthernet: TMenuItem + Caption = 'D'#233'connecter Ethernet' + Hint = 'D'#233'connecter l'#39'interface par Ethernet' + OnClick = MenuDeconnecterEthernetClick + end + object N4: TMenuItem + Caption = '-' + end + object ConnecterCDMrail: TMenuItem + Caption = 'Connecter CDM rail' + OnClick = ConnecterCDMrailClick + end + object DeconnecterCDMRail: TMenuItem + Caption = 'D'#233'connecter CDM rail' + OnClick = DeconnecterCDMRailClick + end + end + end + object ClientSocketCDM: TClientSocket + Active = False + ClientType = ctNonBlocking + Port = 0 + OnConnect = ClientSocketCDMConnect + OnDisconnect = ClientSocketCDMDisconnect + OnRead = ClientSocketCDMRead + OnError = ClientSocketCDMError + Left = 448 + end +end diff --git a/UnitPrinc.~pas b/UnitPrinc.~pas new file mode 100644 index 0000000..f037837 --- /dev/null +++ b/UnitPrinc.~pas @@ -0,0 +1,5520 @@ +Unit UnitPrinc; +(******************************************** + programme direct signaux complexes + delphi 7 + activeX Tmscomm + clientSocket + ******************************************** + note sur le pilotage des accessoires: + raquette octet sortie + + 2 = aiguillage droit + - 1 = aiguillage dévié +*) + + +interface + + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, StdCtrls, OleCtrls, ExtCtrls, jpeg, ComCtrls, + ImgList, ScktComp, StrUtils, Menus, ActnList, MSCommLib_TLB ; + +type + TFormPrinc = class(TForm) + BoutVersion: TButton; + ListBox1: TListBox; + Timer1: TTimer; + Label1: TLabel; + BoutonRaf: TButton; + ScrollBox1: TScrollBox; + ClientSocketLenz: TClientSocket; + GroupBox1: TGroupBox; + EditAdresse: TEdit; + Label2: TLabel; + Editval: TEdit; + Label3: TLabel; + ButtonCommande: TButton; + ButtonTest: TButton; + ButtonInfo: TButton; + GroupBox2: TGroupBox; + EditDetecteur1: TEdit; + BoutCalcZone: TButton; + LabelDetSP: TLabel; + MainMenu1: TMainMenu; + Interface1: TMenuItem; + MenuConnecterUSB: TMenuItem; + DeconnecterUSB: TMenuItem; + N2: TMenuItem; + MenuConnecterEthernet: TMenuItem; + MenuDeconnecterEthernet: TMenuItem; + StatusBar1: TStatusBar; + Label4: TLabel; + MSComm1: TMSComm; + LabelEtat: TLabel; + loco: TButton; + Afficher1: TMenuItem; + Etatdesdtecteurs1: TMenuItem; + Etatdesaiguillages1: TMenuItem; + N3: TMenuItem; + Codificationdesaiguillages1: TMenuItem; + EditDetecteur2: TEdit; + ClientSocketCDM: TClientSocket; + Image9feux: TImage; + Image7feux: TImage; + Image5feux: TImage; + Image4feux: TImage; + Image3feux: TImage; + Image2feux: TImage; + ButtonAffDebug: TButton; + N4: TMenuItem; + ConnecterCDMrail: TMenuItem; + DeconnecterCDMRail: TMenuItem; + procedure FormCreate(Sender: TObject); + procedure MSComm1Comm(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + procedure Timer1Timer(Sender: TObject); + procedure BoutVersionClick(Sender: TObject); + procedure ButtonCommandeClick(Sender: TObject); + procedure EditvalEnter(Sender: TObject); + procedure ListBox1DrawItem(Control: TWinControl; Index: Integer; + Rect: TRect; State: TOwnerDrawState); + procedure BoutonRafClick(Sender: TObject); + procedure ClientSocketLenzError(Sender: TObject; Socket: TCustomWinSocket; + ErrorEvent: TErrorEvent; var ErrorCode: Integer); + procedure ClientSocketLenzRead(Sender: TObject; Socket: TCustomWinSocket); + procedure ButtonTestClick(Sender: TObject); + procedure ButtonInfoClick(Sender: TObject); + procedure BoutCalcZoneClick(Sender: TObject); + procedure MenuConnecterUSBClick(Sender: TObject); + procedure DeconnecterUSBClick(Sender: TObject); + procedure MenuConnecterEthernetClick(Sender: TObject); + procedure MenuDeconnecterEthernetClick(Sender: TObject); + procedure locoClick(Sender: TObject); + procedure AffEtatDetecteurs(Sender: TObject); + procedure Etatdesaiguillages1Click(Sender: TObject); + procedure Codificationdesaiguillages1Click(Sender: TObject); + procedure ClientSocketCDMError(Sender: TObject; + Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; + var ErrorCode: Integer); + procedure ClientSocketLenzConnect(Sender: TObject; + Socket: TCustomWinSocket); + procedure ClientSocketCDMConnect(Sender: TObject; + Socket: TCustomWinSocket); + procedure ClientSocketCDMRead(Sender: TObject; + Socket: TCustomWinSocket); + procedure ButtonAffDebugClick(Sender: TObject); + procedure ConnecterCDMrailClick(Sender: TObject); + procedure DeconnecterCDMRailClick(Sender: TObject); + procedure ClientSocketCDMDisconnect(Sender: TObject; + Socket: TCustomWinSocket); + + private + { Déclarations privées } + procedure DoHint(Sender : Tobject); + public + { Déclarations publiques } + procedure proc_checkBoxFB(Sender : Tobject); + end; + + +// définition des adresses normalisées du décodeur de leds de digitalBahn +// l'ordre des adresses est à respecter dans la programation des signaux. +// L'oeilleton est cablé sur la sortie 4, il est géré directement par le décodeur. **/ +// code des aspects des signaux +const +AF='Client TCP-IP CDM Rail ou USB - système LENZ - Version 1.0'; +carre =0 ; carre_F=1; +semaphore =1 ; semaphore_F=2; +semaphore_cli =2 ; semaphore_cli_F=4; +vert =3 ; vert_F=8; +vert_cli =4 ; vert_cli_F=16; +violet =5 ; violet_F=32; +blanc =6 ; blanc_F=64; +blanc_cli =7 ; blanc_cli_F=128; +jaune =8 ; jaune_F=256; +jaune_cli =9 ; jaune_cli_F=512; +ral_30 =10; ral_30_F=1024; +ral_60 =11; ral_60_F=2048; +rappel_30 =12; rappel_30_F=4096; +rappel_60 =13; rappel_60_F=8192; +Disque_D =14; // pour décodeur LDT +ral_60_jaune_cli =15;ral_60_jaune_cli_F=16384; // pour décodeur LDT +aspect8 =16 ; + +tempoFeu = 100; +MaxAcc = 2048; +LargImg=50;HtImg=91; +const_droit=2;const_devieD=2;const_devieG=3; // aiguillages en position +MaxElParcours=40; + +EtatSign : array[0..13] of string[20] =('carré','sémaphore','sémaphore cli','vert','vert cli','violet', + 'blanc','blanc cli','jaune','jaune cli','ral 30','ral 60','rappel 30','rappel 60'); + +type TBranche = record + BType : integer ; // 1= détecteur 2= aiguillage 3=bis 4=Buttoir + Adresse : integer ; // adresse du détecteur ou de l'aiguillage + end; + + Taiguillage = record + modele : integer; // 0=n'existe pas 1=aiguillage 2=TJD 3=TJS 4=aiguillage triple + position, // position actuelle : 1=dévié 2=droit + Adrtriple, + temps, // temps de pilotage (durée de l'impulsion en x 100 ms) + inversion : integer; // pilotage inversé 0=normal 1=inversé + 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 + ADroitB : char ; // id de branche pour TJD + ADroitBis : integer ; // 0=pas connecté à aiguillage dont l'adresse est bis =1 connecté à un aig bis + + ADevie : integer ; // (identifiant extérieur) adresse de l'élément connecté en position déviée + ADevieB : char; // caractère (D ou S)si aiguillage de l'élément connecté en position déviée + AdevieBis : integer ; // 0=pas connecté à aiguillage dont l'adresse est bis =1 connecté à un aig bis + + APointe : integer; // adresse de l'élément connecté en position droite ; pour les TJD : adresse de l'autre tjd + APointeB : char; + ApointeBis : integer; // 0=pas connecté à aiguillage dont l'adresse est bis =1 connecté à un aig bis + + tjsint : integer; + tjsintb : char ; + + // éléments connectés sur la branche déviée 2 (cas d'un aiguillage triple) + Adevie2 : integer; + Adevie2B : char ; + Adevie2Bis : integer; + + end; + +Taccessoire = (aig,feu); +TMA = (valide,devalide); +//Tparcours = record +// adresse : integer ; +// BType : char; +// end; + +var ancien_tablo_signalCplx,EtatsignalCplx : array[0..MaxAcc] of word; + AvecInitAiguillages,tempsCli,combine,NbreFeux,pasreponse,AdrDevie,precedent , + NombreImages,signalCpx,branche_trouve,Indexbranche_trouve,Actuel,Signal_suivant, + Nbre_recu_cdm,NivDebug,Tempo_chgt_feux : integer; + dem_calcul_zone,Hors_tension2,traceSign,TraceZone,Ferme,ParUSB,parSocket,ackCdm, + NackCDM : boolean; + clignotant,test_leb,nack,Maj_feux_cours,avecMSCom : boolean; + N_event_det : integer; // index du dernier évènement (de 1 à 20) + event_det : array[1..20] of integer; + branche : array [1..100] of string; + parcours : array[1..MaxElParcours] of TBranche ; // parcours des locos en fonction des détecteurs + +const + ClBleuClair=$FF7070 ; + Cyan=$FFA0A0; + clviolet=$FF00FF; + GrisF=$333333; + clOrange=$0077FF; + Feu_X=50;Feu_Y=91; +var + FormPrinc: TFormPrinc; + ack,portCommOuvert,trace,AffMem,AfficheDet,Bis,CDM_connecte,parSocketCDM, + DebugOuv : boolean; + tablo : array of byte; + Enregistrement,AdresseIP,chaine_Envoi,chaine_recue,AdresseIPCDM,recuCDM,Id_CDM : string; + maxaiguillage,detecteur_chgt,Temps,TpsRecuCom,NumPort,Tempo_init,Suivant, + timerSimule,NbreImagePligne,Port,NbreBranches,Index2_det,branche_det,Index_det,portCDM : 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 + detect_Simule : array[0..200] of integer; + index_simule,NDetecteurs : integer; + couleur : Tcolor; + fichier : text; + recuCDML : array of string; + + + // l'indice du tableau aiguillage est son adresse + aiguillage : array[0..MaxAcc] of Taiguillage; + aiguillageB : array[0..MaxAcc] of Taiguillage; + + + // dessin des feux + feux : array[1..MaxAcc] of record + adresse, aspect : integer; // adresse du feu, aspect codé en binaire + Img : TImage; // Pointeur sur structure TImage du feu + Lbl : TLabel; // pointeur sur structure Tlabel du feu + check : TCheckBox; // pointeur sur structure Checkbox avec feu blanc + FeuBlanc : boolean ; // avec checkbox ou pas + decodeur : integer; // type du décodeur + Adr_det1 : integer; // adresse du détecteur1 sur lequel il est implanté + Adr_det2 : integer; // adresse du détecteur1 sur lequel il est implanté (si un signal est pour plusieurs voies) + Adr_det3 : integer; // adresse du détecteur1 sur lequel il est implanté (si un signal est pour plusieurs voies) + Adr_det4 : integer; // adresse du détecteur1 sur lequel il est implanté (si un signal est pour plusieurs voies) + Adr_el_suiv1 : integer; // adresse de l'élément suivant + Adr_el_suiv2 : integer; // adresse de l'élément suivant (si un signal est pour plusieurs voies) + Adr_el_suiv3 : integer; // adresse de l'élément suivant (si un signal est pour plusieurs voies) + Adr_el_suiv4 : integer; // adresse de l'élément suivant (si un signal est pour plusieurs voies) + Btype_suiv1 : integer ; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri 5=bis + Btype_suiv2 : integer ; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri 5=bis + Btype_suiv3 : integer ; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri 5=bis + Btype_suiv4 : integer ; // type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri 5=bis + VerrouCarre : boolean ; // si vrai, le feu se verrouille au carré si pas de train avant le signal + EtatSignal : word ; // comme EtatSignalCplx + end; + Fimage : Timage; + + BrancheN : array[1..100,1..200] of TBranche; + +{$R *.dfm} + +implementation + +uses UnitDebug; + +procedure menu_interface(MA : TMA); +var val : boolean; +begin + val:=MA=valide; + with formprinc do + begin + MenuConnecterUSB.enabled:=val; + DeConnecterUSB.enabled:=val; + MenuConnecterEthernet.enabled:=val; + MenuDeConnecterEthernet.enabled:=val; + end; +end; + +procedure Tformprinc.DoHint(Sender : Tobject); +begin + StatusBar1.Simpletext:=Application.Hint; +end; + +// conversion du motif de bits de la configuration du signal complexe en deux mots: +// premier mot : (retour de la fonction=(premiers bits)code de la signalisation +// deuxième mot: variable Combine = code de la signalisation combinée +// Exemple code_to_aspect(10001000000000) renvoie jaune et Combine=rappel_30 +function code_to_aspect(codebin : word) : word; +var i,mot,premierbit : word; +begin + mot:=codebin; + i:=0;premierbit:=0;Combine:=0; + + while (i<15) do + begin + if (mot and 1)=1 then // si bit 0 du mot est à 1 + begin + if (premierbit=0) then premierbit:=i else Combine:=i; + end; + mot:=mot shr 1; //décaler à droite + inc(i); + end; + code_to_aspect:=premierbit; +end; + +// dessine un cercle plein dans le feu +procedure cercle(ACanvas : Tcanvas;x,y,rayon : integer;couleur : Tcolor); +begin + with Acanvas do + begin + brush.Color:=couleur; + Ellipse(x-rayon,y-rayon,x+rayon,y+rayon); + end; +end; + +// dessine les feux sur une cible à 2 feux +procedure dessine_feu2(Acanvas : Tcanvas;EtatSignal : word); +var code : integer; +begin + code:=code_to_aspect(Etatsignal); // et aspect + // extinctions + if not((code=blanc_cli) and clignotant) then cercle(ACanvas,13,11,6,GrisF); + cercle(ACanvas,13,23,6,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); +end; + +// dessine les feux sur une cible à 3 feux +procedure dessine_feu3(Acanvas : Tcanvas;EtatSignal : word); +var code : integer; +begin + code:=code_to_aspect(Etatsignal); // et aspect + // 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); + + // 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); +end; + +// dessine les feux sur une cible à 4 feux +procedure dessine_feu4(Acanvas : Tcanvas;EtatSignal : word); +var code : integer; +begin + code:=code_to_aspect(Etatsignal); // et aspect + + //extinctions + cercle(ACanvas,13,11,6,GrisF); + if not((code=semaphore_cli) and clignotant) then cercle(ACanvas,13,33,6,GrisF); + if not((code=vert_cli) and clignotant) then cercle(ACanvas,13,22,6,GrisF); + if not((code=jaune_cli) and clignotant) then cercle(ACanvas,13,44,6,GrisF); + + // allumages + if ((code=vert_cli) and (clignotant)) or (code=vert) then cercle(ACanvas,13,22,6,clGreen); + if ((code=jaune_cli) and (clignotant)) or (code=jaune) then cercle(Acanvas,13,44,6,clOrange); + if ((code=semaphore_cli) and (clignotant)) or (code=semaphore) then cercle(ACanvas,13,33,6,clRed); + if code=carre then + begin + cercle(ACanvas,13,33,6,clRed); + cercle(ACanvas,13,11,6,clRed); + end; +end; + +// dessine les feux sur une cible à 5 feux +procedure dessine_feu5(Acanvas : Tcanvas;EtatSignal : word); +var code : integer; +begin + code:=code_to_aspect(Etatsignal); // et aspect + // 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); + + //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=carre then + begin + cercle(ACanvas,13,44,6,clRed); + cercle(ACanvas,13,11,6,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); +end; + +// affiche un texte dans la fenêtre +procedure Affiche(s : string;lacouleur : TColor); +begin + couleur:=lacouleur; + with formprinc.ListBox1 do + begin + Items.addObject(s,pointer(lacouleur)); + TopIndex:= Items.Count - 1; + end; +end; + +procedure AfficheDebug(s : string;lacouleur : TColor); +begin + if DebugOuv then + FormDebug.MemoDebug.Lines.add(s); +end; + +// dessine les feux sur une cible à 7 feux +procedure dessine_feu7(Acanvas : Tcanvas;EtatSignal : word); +var code : integer; +begin + code:=code_to_aspect(Etatsignal); // et combine + // effacements + + if not((code=blanc_cli) and clignotant) then cercle(ACanvas,13,23,6,violet); + 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); + 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); + + // 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); + 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=carre then + begin + cercle(ACanvas,13,35,6,clRed); + cercle(ACanvas,13,55,6,clRed); + end; +end; + +// dessine les feux sur une cible à 9 feux +procedure dessine_feu9(Acanvas : Tcanvas;etatsignal : word); +var code : integer; +begin + code:=code_to_aspect(Etatsignal); // et aspect + // extinctions + if not((code=blanc_cli) and clignotant) then cercle(ACanvas,13,36,6,grisF); + if not((code=ral_60) and clignotant) or not((combine=ral_60) and clignotant) then + begin + cercle(ACanvas,13,24,6,grisF);cercle(ACanvas,37,24,6,grisF); + end; + if not((code=jaune_cli) and clignotant) then cercle(ACanvas,13,80,6,grisF); + if not((code=rappel_60) and clignotant) or not((combine=rappel_60) and clignotant) then + begin + cercle(ACanvas,37,12,6,grisF);cercle(ACanvas,37,37,6,grisF); + end; + cercle(ACanvas,13,47,6,grisF); // carré supérieur + if not((code=semaphore_cli) and clignotant) then cercle(ACanvas,13,69,6,grisF); + if not((code=vert_cli) and clignotant) then cercle(ACanvas,13,58,6,grisF); + + // allumages + if ((code=ral_60) and clignotant) or (code=ral_30) or + ((combine=ral_60) and clignotant) or (combine=ral_30) then + begin + cercle(ACanvas,13,24,6,clOrange);cercle(ACanvas,37,24,6,clOrange); + end; + + if ((code=rappel_60) and clignotant) or (code=rappel_30) or + ((combine=rappel_60) and clignotant) or (combine=rappel_30) then + begin + cercle(ACanvas,37,12,6,clOrange);cercle(ACanvas,37,37,6,clOrange); + end; + if ((code=jaune_cli) and clignotant) or (code=jaune) then cercle(Acanvas,13,80,6,clOrange); + if ((code=semaphore_cli) and clignotant) or (code=semaphore) then cercle(ACanvas,13,69,6,clRed); + if ((code=vert_cli) and clignotant) or (code=vert) then cercle(ACanvas,13,58,6,clGreen); + if ((code=blanc_cli) and clignotant) or (code=blanc) then cercle(ACanvas,13,36,6,clWhite); + + if code=carre then + begin + cercle(ACanvas,13,47,6,clRed); + cercle(ACanvas,13,69,6,clRed); + end; +end; + + +// renvoie l'index du feu dans le tableau feux[] en fonction de son adresse +//si pas de feu renvoie 0 +function Index_feu(adresse : integer) : integer; +var i : integer; + trouve : boolean; +begin +i:=1; + repeat + trouve:=feux[i].adresse=adresse; + if not(trouve) then inc(i); + until (trouve) or (i>=100); + 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); +var i : integer; +begin + i:=Index_feu(adresse); + if i<>0 then + case feux[i].aspect of + 2: dessine_feu2(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); + 3: dessine_feu3(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); + 4: dessine_feu4(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); + 5: dessine_feu5(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); + 7: dessine_feu7(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); + 9: dessine_feu9(Feux[i].Img.Canvas,EtatSignalCplx[adresse]); + end; +end; + + +// créée une image dynamiquement pour un nouveau feu déclaré dans le fichier de config +procedure cree_image(rang : integer); +var TypeFeu : integer; + s : string; +const espY = 15; // espacement Y entre deux lignes de feux +begin + TypeFeu:=feux[rang].aspect; + Feux[rang].Img:=Timage.create(Formprinc.ScrollBox1); + with Feux[rang].Img do + begin + Parent:=Formprinc.ScrollBox1; // dire que l'image est dans la scrollBox1 + Top:=(HtImg+espY+20)*((rang-1) div NbreImagePLigne); // détermine les dimensions + Left:=10+ (LargImg+5)*((rang-1) mod (NbreImagePLigne)); + s:='Decodeur='+intToSTR(feux[rang].Decodeur)+' Adresse détecteur associé='+intToSTR(feux[rang].Adr_det1)+ + ' Adresse élement suivant='+intToSTR(feux[rang].Adr_el_suiv1); + if feux[rang].Btype_suiv1=2 then s:=s+' (aig)'; + if feux[rang].Btype_suiv1=5 then s:=s+' (aig bis)'; + + Hint:=s; + case TypeFeu of // charger le bit map depuis le fichier + 2 : picture.bitmap:=Formprinc.Image2feux.picture.Bitmap; + //picture.Bitmap.LoadFromFile('2feux.bmp'); + 3 : picture.bitmap:=Formprinc.Image3feux.picture.Bitmap; + //picture.Bitmap.LoadFromFile('3feux.bmp'); + 4 : picture.bitmap:=Formprinc.Image4feux.picture.Bitmap; + //picture.Bitmap.LoadFromFile('4feux.bmp'); + 5 : picture.bitmap:=Formprinc.Image5feux.picture.Bitmap; + //picture.Bitmap.LoadFromFile('5feux.bmp'); + 7 : picture.bitmap:=Formprinc.Image7feux.picture.Bitmap; + //picture.Bitmap.LoadFromFile('7feux.bmp'); + //9 : picture.Bitmap.LoadFromFile('9feux.bmp'); + 9 : picture.bitmap:=Formprinc.Image9feux.picture.Bitmap; + + + end; + // mettre rouge par défaut + if feux[rang].aspect=2 then EtatSignalCplx[feux[rang].adresse]:=violet_F; + if feux[rang].aspect=3 then EtatSignalCplx[feux[rang].adresse]:=semaphore_F; + if feux[rang].aspect>3 then EtatSignalCplx[feux[rang].adresse]:=carre_F; + + dessine_feu(feux[rang].adresse); + //if feux[rang].aspect=5 then cercle(Picture.Bitmap.Canvas,13,22,6,ClYellow); + end; + + // créée le label pour afficher son adresse + Feux[rang].Lbl:=Tlabel.create(Formprinc.ScrollBox1); + with Feux[rang].Lbl do + begin + caption:='@'+IntToSTR(Feux[rang].adresse); + Parent:=Formprinc.ScrollBox1; + width:=100;height:=20; + Top:=HtImg+((HtImg+EspY+20)*((rang-1) div NbreImagePLigne)); + Left:=10+ (LargImg+5)*((rang-1) mod (NbreImagePLigne)); + BringToFront; + end; + + // créée le checkBox si un feu blanc est déclaré sur ce feu + if feux[rang].FeuBlanc then + begin + Feux[rang].check:=TCheckBox.create(Formprinc.ScrollBox1); // ranger l'adresse de la Checkbox dans la structure du feu + Feux[rang].check.onClick:=formprinc.proc_checkBoxFB; // affecter l'adresse de la procédure de traitement quand on clique dessus + Feux[rang].check.Hint:=intToSTR(rang); // affecter l'index du feu dans le HINT pour pouvoir le retrouver plus tard + + with Feux[rang].Check do + begin + caption:='dem FB'; + Parent:=Formprinc.ScrollBox1; + width:=100;height:=15; + Top:=HtImg+15+((HtImg+EspY+20)*((rang-1) div NbreImagePLigne)); + Left:=10+ (LargImg+5)*((rang-1) mod (NbreImagePLigne)); + BringToFront; + end; + end; +end; + +// calcule le checksum d'une trame +Function Checksum(s : string) : string; +var i : integer; + check : byte; +begin + check:=0; + // on commence à 3 pour ne pas calculer le checksum sur FF FE + for i:=3 to length(s) do + begin + check:=check xor ord(s[i]); + end; + checksum:=s+char(check); +end; + +// renvoie une chaine ASCI Hexa affichable à partir d'une chaîne +function chaine_HEX(s: string) : string; +var i : integer; + sa_hex: string; +begin + sa_hex:=''; + for i:=1 to length(s) do + begin + sa_hex:=sa_hex+IntToHex(ord(s[i]),2)+' '; + end; + chaine_HEX:=sa_hex; +end; + +// Affiche une chaîne en Hexa Ascii +procedure affiche_chaine_hex(s : string;couleur : Tcolor); +begin + if trace then Affiche(chaine_HEX(s),couleur); +end; + +// temporisation en x 100 ms (0,1 s) +procedure Tempo(ValTemps : integer); +begin + temps:=Valtemps; + repeat + Application.ProcessMessages; + until (temps<=0); +end; + +// envoi d'une chaîne à la centrale par USBLenz ou socket, puis attend l'ack ou le nack +function envoi(s : string) : boolean; +var temps : integer; +begin + if Hors_tension2=false then + begin + if Trace then affiche_chaine_Hex(s,ClGreen); + if portCommOuvert then FormPrinc.MSComm1.Output:=s; + if parSocket then Formprinc.ClientSocketLenz.Socket.SendText(s); + // attend l'ack + ack:=false;nack:=false; + if portCommOuvert or ParSocket then + begin + temps:=0; + repeat + inc(temps);tempo(1); + until ferme or ack or nack or (temps>5); // l'interface répond < 5s en mode normal et 1,5 mn en mode programmation + if not(ack) or nack then + begin + Affiche('Pas de réponse de l''interface',clRed);inc(pasreponse); + if pasreponse>3 then hors_tension2:=true; + end; + if ack then begin pasreponse:=0;hors_tension2:=false;end; + end; + end; + envoi:=ack; +end; + +// insère l'id pour le serveur CDM dans une chaîne +function place_id(s : string) : string; +begin + delete(s,5,2); + insert(id_cdm,s,5); + place_id:=s; +end; + +// prépare la chaîne de commande pour un accessoire via CDM +Function chaine_CDM_Acc(adresse,etat1 : integer) : string; +var so,sx,s : string; + i : integer; +begin + { exemple de commande envoyée au serveur pour un manoeuvrer accessoire + C-C-00-0004-CMDACC-DCCAC|018|02|AD=100;STATE=1; + " NAME : nom de l'aiguille + " OBJ: numéro CDM-Rail de l'aiguille (index) + " AD: adresse (DCC) de l'aiguille + " AD2: adresse #2 (DCC) de l'aiguille (TJD bi-moteurs ou aiguille triples) + " STATE: état de l'aiguille + o 0: position droite (non déviée) + o 1: dévié (TJD, bretelles doubles) + o 2: dévié droit + o 3: dévié gauche + o 4: pos. droite #2 (TJD 4 états) + o 5: pos. déviée #2 (TJD 4 états) + } + so:=place_id('C-C-01-0004-CMDACC-DCCAC'); + //s:='NAME='+format('%.*d',[2,24])+';'; + //s:=s+'OBJ='+format('%.*d',[2,24])+';'; + s:=s+'AD='+format('%.*d',[1,adresse])+';'; + s:=s+'STATE='+format('%.*d',[1,etat1])+';'; + + sx:=format('%.*d',[2,2])+'|'; // 2 paramètres + so:=so+ '|'+format('%.*d',[3,length(s)+length(sx)])+'|'+sx; + + chaine_CDM_Acc:=so+s; +end; + +// envoi d'une chaîne à CDM par socket, puis attend l'ack ou le nack +function envoi_CDM(s : string) : boolean; +var temps : integer; +begin + //if Trace then + //if NivDebug=3 then begin AfficheDebug('Envoi à CDM rail',clRed);afficheDebug(s,ClGreen);end; + if parSocketCDM then Formprinc.ClientSocketCDM.Socket.SendText(s); + // attend l'ack + ackCDM:=false;nackCDM:=false; + if ParSocketCDM then + begin + temps:=0; + repeat + inc(temps);tempo(1); + until ferme or ackCDM or nackCDM or (temps>2); // CDM répond < 1s + if not(ackCDM) or nack then + begin + Affiche('Pas de réponse de CDM Rail',clRed); + end; + end; + envoi_CDM:=ackCDM; +end; + +// active ou désactive une sortie. Une adresse comporte deux sorties identifiées par "octet" +// Adresse : adresse de l'accessoire +// octet : numéro (1-2) de la sortie à cette adresse +// etat : false (désactivé) true (activé) +procedure pilote_direct(adresse:integer;octet : byte;etat : boolean); +var groupe : integer ; + fonction : byte; + s : string; +begin + groupe:=(adresse-1) div 4; + fonction:=((adresse-1) mod 4)*2 + (octet-1); + // pilotage + if etat then + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $80) + else + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $88); + + s:=checksum(s); + envoi(s); // envoi de la trame et attente Ack +end; + +procedure pilote_direct01(adresse:integer;octet:integer); +var groupe : integer ; + fonction : byte; + s : string; +begin + if octet=0 then octet:=2; + groupe:=(adresse-1) div 4; + fonction:=((adresse-1) mod 4)*2 + (octet-1); + // pilotage + if octet=2 then + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $80) + else + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $88); + + s:=checksum(s); + if envoi(s) then exit else envoi(s); // envoi de la trame et attente Ack sinon renvoyer +end; + + +// pilotage d'un accessoire (décodeur d'aiguillage, de signal) +// octet = 0 ou 1 ou 2 +// la sortie "octet" est mise à 1 puis à 0 +// acc = aig ou feu +procedure pilote_acc(adresse : integer;octet : byte;Acc : TAccessoire); +var groupe,temps : integer ; + fonction : byte; + s : string; +begin + if CDM_connecte then + begin + //AfficheDebug(intToSTR(adresse),clred); + s:=chaine_CDM_Acc(adresse,octet); + envoi_CDM(s); + if acc=feu then exit; + s:=chaine_CDM_Acc(adresse,0); + envoi_CDM(s); + exit; + end; + // test si pilotage inversé + //Affiche('Accessoire '+intToSTR(adresse),clLime); + if hors_tension2=false then + begin + if aiguillage[adresse].inversion=1 then + begin + if octet=1 then octet:=2 else octet:=1; + end; + if (octet=0) or (octet>2) then exit; + groupe:=(adresse-1) div 4; + fonction:=((adresse-1) mod 4)*2 + (octet-1); + // pilotage à 1 + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $88); // activer la sortie + s:=checksum(s); + envoi(s); // envoi de la trame et attente Ack + // si l'accessoire est un feu, sortir + if acc=feu then exit; + + // si aiguillage, faire une temporisation + if index_feu(adresse)=0 then + begin + temps:=aiguillage[adresse].temps;if temps=0 then temps:=4; + if portCommOuvert or ParSocket then tempo(temps); + end; + // pilotage à 0 pour éteindre le pilotage de la bobine du relais + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $80); // désactiver la sortie + s:=checksum(s); + envoi(s); // envoi de la trame et attente Ack + end; +end; + +// pilote accessoire en entrée 0->2 1->1 +procedure pilote_acc01(adresse : integer;octet : byte); +var groupe,temps : integer ; + fonction : byte; + s : string; +begin + // test si pilotage inversé + if octet=0 then octet:=2; + if aiguillage[adresse].inversion=1 then + begin + if octet=1 then octet:=2 else octet:=1; + end; + if (octet=0) or (octet>2) then exit; + groupe:=(adresse-1) div 4; + fonction:=((adresse-1) mod 4)*2 + (octet-1); + // pilotage à 1 + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $88); // activer la sortie + s:=checksum(s); + envoi(s); // envoi de la trame et attente Ack + sleep(10); // temps minimal pour ne pas avoir le défaut station occupée qd on pilote un signal leb + temps:=aiguillage[adresse].temps;if temps=0 then temps:=4; + // si l'accessoire est un feu, fixer l tempo à 1 + //if index_feu(adresse)<>0 then temps:=1; + + //if portCommOuvert or ParSocket then tempo(temps); + // pilotage à 0 pour éteindre le pilotage de la bobine du relais + s:=#$ff+#$fe+#$52+Char(groupe)+char(fonction or $80); // désactiver la sortie + s:=checksum(s); + envoi(s); // envoi de la trame et attente Ack +end; + +procedure vitesse_loco(loco : integer;vitesse : integer;sens : boolean); +var s : string; +begin + if sens then vitesse:=vitesse or 128; + s:=#$ff+#$fe+#$e4+#$13+#$0+char(loco)+char(vitesse); + s:=checksum(s); + envoi(s); +end; + +function testBit(n : word;position : integer) : boolean; +begin + testBit:=n and (1 shl position) = (1 shl position); +end; + +Function RazBit(n : word;position : integer) : word; +begin + RazBit:=n and not(1 shl position); +end; + +Function SetBit(n : word;position : integer) : word; +begin + SetBit:=n or (1 shl position); +end; + +// mise à jour état signal complexe dans le tableau de bits du signal EtatSignalCplx */ +// adresse : adresse du signal complexe +// Aspect : code représentant l'état du signal de 0 à 15 +procedure Maj_Etat_Signal(adresse,aspect : integer); +begin + if testBit((EtatSignalCplx[adresse]),aspect)=false then // si le bit dans l'état du signal n'est pas allumé, procéder. + begin + // effacement du motif de bits en fonction du nouvel état demandé suivant la règle des signaux complexes + if (aspect<=blanc_cli) then + begin + EtatSignalCplx[adresse]:=0; //Tout aspect <=7 efface les autres + end; + if (aspect=jaune) then // jaune + begin + EtatSignalCplx[adresse]:=RazBit(EtatSignalCplx[adresse],jaune_cli); // cas du jaune: efface le bit du jaune clignotant (bit 9) + EtatSignalCplx[adresse]:=RazBit(EtatSignalCplx[adresse],ral_30); // cas du jaune: efface le bit du ral_30 (bit 10) + EtatSignalCplx[adresse]:=RazBit(EtatSignalCplx[adresse],ral_60); // cas du jaune: efface le bit du ral_60 (bit 11) + EtatSignalCplx[adresse]:=EtatSignalCplx[adresse] and $FF00; // et effacer les bits 0 à 7 + end; + if (aspect=jaune_cli) then // jaune clignotant + begin + EtatSignalCplx[adresse]:=RazBit(EtatSignalCplx[adresse],jaune); // cas du jaunecli: efface le bit du jaune (bit 8) + EtatSignalCplx[adresse]:=EtatSignalCplx[adresse] and $FF00; // et effacer les bits 0 à 7 + end; + if (aspect=ral_30) then // ralentissement 30 + begin + EtatSignalCplx[adresse]:=EtatSignalCplx[adresse] and not($38FF); // cas du ral30: efface les bits 0 1 2 3 4 5 6 7 11 12 et 13 : 11 1000 1111 1111 + end; + if (aspect=ral_60) then // ralentissement 60 + begin + EtatSignalCplx[adresse]:=EtatSignalCplx[adresse] and not($34FF); // cas du ral60: efface les bits 10 12 et 13 et de 0 à 7 : 11 0100 1111 1111 + end; + if (aspect=rappel_30) then // rappel 30 + begin + EtatSignalCplx[adresse]:=EtatSignalCplx[adresse] and not($2c00); // cas du rappel30: efface les bits 10 11 et 13 : 10 1100 0000 0000 + end; + if (aspect=rappel_60) then // rappel 60 + begin + EtatSignalCplx[adresse]:=EtatSignalCplx[adresse] and not($1C00); // cas du rappel60: efface les bits 10 11 et 12 1 1100 0000 0000 + end; + if (aspect=aspect8) then // ral_60_jaune_cli décodeur LDT + begin + EtatSignalCplx[adresse]:=jaune_cli_F or ral_60_F; // cas du ralentissement 60 + avertissement clignotant : efface les bits 10 11 et 12 + end; + if (aspect<>aspect8) then EtatSignalCplx[adresse]:=SetBit(EtatSignalCplx[adresse],aspect); // allume le numéro du bit de la fonction du signal + end; +end; + + +{============================================= +envoie les données au décodeur digital bahn équipé du logiciel "led_schalten" +sur un panneau directionnel - adresse : adresse du signal - code de 1 à 3 pour allumer +; le panneau directionnel à 1, 2 ou 3 leds. +============================================== } +procedure envoi_directionBahn(adr : integer;code : integer); +begin + if (EtatSignalCplx[adr]<>code) then + begin + if (traceSign) then Affiche('Signal directionnel '+IntToSTR(adr)+' '+intToSTR(code),clOrange); + case code of + 0 : begin pilote_acc(adr,1,feu); // sortie 1 à 0 + sleep(tempoFeu); + pilote_acc(adr+1,1,feu); // sortie 2 à 0 + sleep(Tempofeu); + pilote_acc(adr+2,1,feu); // sortie 3 à 0 + sleep(TempoFeu); + end; + 1 : begin pilote_acc(adr,2,feu); // sortie 1 à 1 + sleep(tempoFeu); + pilote_acc(adr+1,1,feu); // sortie 2 à 0 + sleep(Tempofeu); + pilote_acc(adr+2,1,feu); // sortie 3 à 0 + sleep(TempoFeu); + end; + 2 : begin pilote_acc(adr,2,feu); // sortie 1 à 1 + sleep(tempoFeu); + pilote_acc(adr+1,2,feu); // sortie 2 à 1 + sleep(Tempofeu); + pilote_acc(adr+2,1,feu); // sortie 3 à 0 + sleep(TempoFeu); + end; + 3 : begin pilote_acc(adr,2,feu); // sortie 1 à 1 + sleep(tempoFeu); + pilote_acc(adr+1,2,feu); // sortie 2 à 1 + sleep(Tempofeu); + pilote_acc(adr+2,2,feu); // sortie 3 à 1 + sleep(TempoFeu); + end; + end; + EtatSignalCplx[adr]:=code; + end; +end; + + +{ ============================================= +envoie les données au signal de direction pour un décodeur CDF +adresse : adresse du signal - code de 1 à 3 pour allumer +le panneau directionnel à 1, 2, 3 ou 4 leds. +============================================== } +procedure envoi_directionCDF(adr : integer;code : integer); +begin + if (EtatSignalCplx[adr]<>code) then + begin + if traceSign then Affiche('signal directionnel CDF: '+IntToSTR(adr)+' '+intToSTR(code),ClOrange); + + case code of + // éteindre toutes les leds + 0 : + begin + pilote_acc(adr,1,feu) ; + sleep(200); + end; + // code 1 : allume le feu le plus à gauche + 1 : + begin + pilote_acc(adr,2,feu) ; + sleep(200); + end; + 2 : //allume 2 feux + begin + pilote_acc(adr+1,1,feu) ; + sleep(200); + end; + // code 3 : allume 3 feux + 3 : + begin + pilote_acc(adr+1,2,feu) ; + sleep(200); + end; + end; + EtatSignalCplx[adr]:=code; + end; +end; + +{========================================================================== +envoie les données au décodeur CDF pour un signal +===========================================================================*} +procedure envoi_CDF(adresse : integer); +var code,aspect,index : integer; +begin + index:=Index_feu(adresse); // tranforme l'adresse du feu en index tableau + code:=feux[index].aspect; // aspect du feu; + if (ancien_tablo_signalCplx[adresse]<>EtatSignalCplx[adresse]) then //; && (stop_cmd==FALSE)) + begin + ancien_tablo_signalCplx[adresse]:=EtatSignalCplx[adresse]; + aspect:=code_to_aspect(code); + if traceSign then affiche('Signal CDF: '+intToSTR(adresse)+' '+intToSTR(code),clOrange); + + if (aspect=carre) then pilote_acc(adresse,2,feu) ; + if (aspect=semaphore) then pilote_acc(adresse,1,feu) ; + if (aspect=vert) then pilote_acc(adresse+1,1,feu) ; + if (aspect=jaune) then pilote_acc(adresse+1,2,feu); + // signalisation non combinée rappel 30 seul + if (aspect=rappel_30) then pilote_acc(adresse+1,1,feu); + + // 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 + end; +end; + +{========================================================================== +envoie les données au décodeur LEB pour un signal +===========================================================================*} +procedure envoi_LEB(adr : integer); +var codebin,aspect : integer; + s : string; + procedure envoi5_LEB(selection :byte); + var i : integer; + begin + s:=''; + for i:=0 to 4 do + begin + if (testBit(selection,i)) then begin pilote_acc(adr+i,1,feu);s:=s+'1';end + else begin pilote_acc(adr+i,2,feu) ; s:=s+'0';end; + //if (testBit(selection,i)) then begin pilote_acc(adr+i,1);s:=s+'1';end + //else begin pilote_acc(adr+i,2) ; s:=s+'0';end; + //Sleep(50); + end; + //Affiche(inttoStr(selection),clOrange); + //Affiche(s,clOrange); + end; +begin + +if (ancien_tablo_signalCplx[adr]<>EtatSignalCplx[adr]) then //; && (stop_cmd==FALSE)) +begin + ancien_tablo_signalCplx[adr]:=EtatSignalCplx[adr]; + codebin:=EtatSignalCplx[adr]; + aspect:=code_to_aspect(codebin); + if traceSign then + begin + s:='Signal LEB: ad'+IntToSTR(adr)+'='+etatSign[aspect]; + //s:='Signal LEB: ad'+IntToSTR(adr)+' aspect='+intToSTR(aspect)+' combine='+intToSTR(combine); + if Combine<>0 then s:=s+' + '+etatSign[combine]; + Affiche(s,clYellow); + end; + Sleep(40); // si le feu se positionne à la suite d'un positionnement d'aiguillage, on peut avoir le message station occupée + + if (Combine=0) then + begin + if (aspect=carre) then envoi5_LEB(0); + if (aspect=violet) then envoi5_LEB(1); + if (aspect=blanc_cli) then envoi5_LEB(2); + if (aspect=blanc) then envoi5_LEB(3); + if (aspect=semaphore) then envoi5_LEB(4); + if (aspect=semaphore_cli) then envoi5_LEB(5); + if (aspect=jaune) then envoi5_LEB(8); + if (aspect=jaune_cli) then envoi5_LEB($a); + if (aspect=vert_cli) then envoi5_LEB($c); + if (aspect=vert) then envoi5_LEB($d); + if (aspect=rappel_30) then envoi5_LEB(6); + if (aspect=rappel_60) then envoi5_LEB(7); + if (aspect=ral_30) then envoi5_LEB(9); + if (aspect=ral_60) then envoi5_LEB($b); + end; + if (aspect=0) then + begin + if (Combine=rappel_30) then envoi5_LEB(6); + if (Combine=rappel_60) then envoi5_LEB(7); + if (Combine=ral_30) then envoi5_LEB(9); + if (Combine=ral_60) then envoi5_LEB($b); + end; + if ((Combine=rappel_30) and (aspect=jaune)) then envoi5_LEB($e); + if ((Combine=rappel_30) and (aspect=jaune_cli)) then envoi5_LEB($f); + 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); +end; +end; + +(*========================================================================== +envoie les données au décodeur NMRA étendu + adresse=adresse sur le BUS DCC + code=code d'allumage : +0. Carré +1. Sémaphore +2. Sémaphore clignotant +3. Vert +4. Vert clignotant +5. Carré violet +6. Blanc +7. Blanc clignotant +8. Avertissement +9. Avertissement clignotant +10. Ralentissement 30 +11. Ralentissement 60 +12. Ralentissement 60 + avertissement clignotant +13. Rappel 30 +14. Rappel 60 +15. Rappel 30 + avertissement +16. Rappel 30 + avertissement clignotant +17. Rappel 60 + avertissement +18. rappel 60 + avertissement clignotant + +/*===========================================================================*) +procedure envoi_NMRA(adresse,code : integer); +var valeur : integer ; +begin + if (ancien_tablo_signalCplx[adresse]<>EtatSignalCplx[adresse]) then + begin + ancien_tablo_signalCplx[adresse]:=EtatSignalCplx[adresse]; + case (code) of + carre_F : valeur:=0; + semaphore_F : valeur:=1; + semaphore_cli_F : valeur:=2; + vert_F : valeur:=3; + vert_cli_F : valeur:=4; + violet_F : valeur:=5; + blanc_F : valeur:=6; + blanc_cli_F : valeur:=7; + jaune_F : valeur:=8; + jaune_cli_F : valeur:=9; + ral_30_F : valeur:=10; + ral_60_F : valeur:=11; + (ral_60_F + jaune_cli_F) : valeur:=12; + (rappel_30_F) : valeur:=13; + (rappel_60_F) : valeur:=14; + (rappel_30_F + jaune_F) : valeur:=15; + (rappel_30_F + jaune_cli_F) : valeur:=16; + (rappel_60_F + jaune_F) : valeur:=17; + (rappel_60_F + jaune_cli_F) : valeur:=18; + else valeur:=code; + end; + pilote_acc(adresse,valeur,feu); + end; +end; + + +{========================================================================== +envoie les données au décodeur LDT + adresse=adresse sur le BUS DCC + code=code d'allumage selon l'adressage (ex carre, vert, rappel_30 ..). + mode=mode du décodeur adressé, de 1 à 2 + un décodeur occupe 8 adresses + Le mode 1 permet la commande des signaux de 2, 3 et 4 feux + Le mode 2 permet la commande de signaux de plus de 4 feux +===========================================================================} +procedure envoi_LDT(adr : integer); +var index,codebin,aspect,mode : integer; +begin + codebin:=EtatSignalCplx[adr]; + aspect:=code_to_aspect(codebin); + if (ancien_tablo_signalCplx[adr]<>EtatSignalCplx[adr]) then //; && (stop_cmd==FALSE)) + begin + ancien_tablo_signalCplx[adr]:=EtatSignalCplx[adr]; + //if (tempo_ACC>0) then sleep(100); // les commandes entre 2 feux successives doivent être séparées au minimum de 100 ms + if traceSign then affiche('Signal LDT: '+IntToSTR(adr)+' '+intToSTR(mode)+' '+intTOSTR(codebin),clOrange); + if (aspect=semaphore) or (aspect=vert) or (aspect=carre) or (aspect=jaune) then mode:=1 else mode:=2; + + case mode of + // pour les décodeurs en mode 0, il faut écrire la routine vous même car le pilotage dépend du cablage + // sauf pour le sémaphore, vert et jaune fixe + 1 : // mode 1: feux 2 3 & 4 feux + begin + if (aspect=semaphore) then pilote_acc(adr,1,feu); + if (aspect=vert) then pilote_acc(adr,2,feu); + if (aspect=carre) then pilote_acc(adr+1,1,feu); + if (aspect=jaune) then pilote_acc(adr+1,2,feu); + end; + 2 : // mode 2: plus de 4 feux + begin + if (aspect=semaphore) then begin pilote_acc(adr+2,1,feu);sleep(tempoFeu);pilote_acc(adr,1,feu);end; + if (aspect=vert) then begin pilote_acc(adr+2,1,feu);sleep(tempoFeu);pilote_acc(adr,2,feu);end; + if (aspect=carre) then begin pilote_acc(adr+2,1,feu);sleep(tempoFeu);pilote_acc(adr+1,1,feu);end; + if (aspect=jaune) then begin pilote_acc(adr+2,1,feu);sleep(tempoFeu);pilote_acc(adr+1,2,feu);end; + if (aspect=violet) then begin pilote_acc(adr+2,2,feu);sleep(tempoFeu);pilote_acc(adr,1,feu);end; + if (aspect=blanc) then begin pilote_acc(adr+2,2,feu);sleep(tempoFeu);pilote_acc(adr,2,feu);end; + if (aspect=semaphore) then begin pilote_acc(adr+2,2,feu);sleep(tempoFeu);pilote_acc(adr+1,1,feu);end; + if (aspect=aspect8) then begin pilote_acc(adr+2,2,feu);sleep(tempoFeu);pilote_acc(adr+1,2,feu);end; + if (aspect=ral_60_jaune_cli) then begin pilote_acc(adr+3,1,feu);sleep(tempoFeu);pilote_acc(adr,1,feu);end; // demande groupe 3 + if (aspect=vert_cli) then begin pilote_acc(adr+3,1,feu);sleep(tempoFeu);pilote_acc(adr,2,feu);end; // demande groupe 3 + if (aspect=Disque_D) then begin pilote_acc(adr+3,1,feu);sleep(tempoFeu);pilote_acc(adr+1,1,feu);end;// demande groupe 3 + if (aspect=jaune_cli) then begin pilote_acc(adr+3,1,feu);sleep(tempoFeu);pilote_acc(adr+1,2,feu);end; + if (aspect=ral_30) then begin pilote_acc(adr+3,2,feu);sleep(tempoFeu);pilote_acc(adr,1,feu);end; + if (aspect=ral_60) then begin pilote_acc(adr+3,2,feu);sleep(tempoFeu);pilote_acc(adr,2,feu);end; + if (aspect=rappel_30) then begin pilote_acc(adr+3,2,feu);sleep(tempoFeu);pilote_acc(adr+1,1,feu);end; + if (aspect=rappel_60) then begin pilote_acc(adr+3,2,feu);sleep(tempoFeu);pilote_acc(adr+1,2,feu);end; + end; + end; + end; +end; + + +procedure envoi_virtuel(adresse : integer); +var + aspect,code : integer; +begin + code:=etatsignalcplx[adresse]; + if (ancien_tablo_signalCplx[adresse]<>EtatSignalCplx[adresse]) then //; && (stop_cmd==FALSE)) + begin + ancien_tablo_signalCplx[adresse]:=EtatSignalCplx[adresse]; + aspect:=code_to_aspect(code); // transforme le motif de bits en numéro "code des aspects des signaux" + if (tracesign) then Affiche('Signal virtuel: '+intToSTR(adresse)+' Etat '+etatSign[aspect],clyellow); + end; +end; + +(*========================================================================== +envoie les données au décodeur digitalbahn équipé du logiciel "led_signal_10" + adresse=adresse sur le BUS DCC + codebin=motif de bits représentant l'état des feux L'allumage est fait en + adressant l'une des 14 adresses pour les 14 leds possibles du feu. + Ici on met le bit 1 à 1 (état "vert" du programme hexmanipu +===========================================================================*) +//procedure envoi_signalBahn(adresse,codebin : integer); +procedure envoi_signalBahn(adresse : integer); +var aspect,combineLoc,codebin : integer; + ralrap, jau ,Ancralrap,Ancjau : boolean; + s : string; +begin +// s:='@='+IntToSTR(adresse)+' '+intToSTR(ancien_tablo_signalCplx[adresse])+' '+intToSTR(EtatsignalCplx[adresse]); +// affiche(s,ClYellow); + if (ancien_tablo_signalCplx[adresse]<>EtatSignalCplx[adresse]) then //; && (stop_cmd==FALSE)) + begin + codebin:=EtatSignalCplx[adresse]; + aspect:=code_to_aspect(codebin); // transforme le motifs de bits en numéro "code des aspects des signaux" + combineLoc:=combine; // copier dans variable locale + //dessine_feu(adresse); + if traceSign then + begin + s:='Signal bahn: ad'+IntToSTR(adresse)+'='+etatSign[aspect]; + if CombineLoc<>0 then s:=s+' + '+etatSign[combineLoc]; + Affiche(s,clOrange); + end; + // spécifique au décodeur digital bahn: + // si le signal affichait un signal combiné, il faut éteindre le signal avec un sémaphore + // avant d'afficher le nouvel état non combiné + Ancralrap:=(TestBit(ancien_tablo_signalCplx[adresse],ral_30)) or (TestBit(ancien_tablo_signalCplx[adresse],ral_60)) or + (TestBit(ancien_tablo_signalCplx[adresse],rappel_30)) or (TestBit(ancien_tablo_signalCplx[adresse],rappel_60)) ; + // si ancien état du signal=jaune ou jaune cli + Ancjau:=(TestBit(ancien_tablo_signalCplx[adresse],jaune)) or (TestBit(ancien_tablo_signalCplx[adresse],jaune_cli)) ; + + // si état demandé du signal=ralentissement ou rappel + ralrap:=(TestBit(codebin,ral_30)) or (TestBit(codebin,ral_60)) or + (TestBit(codebin,rappel_30)) or (TestBit(codebin,rappel_60)) ; + // si état demandé du signal=jaune ou cli + jau:=TestBit(codebin,jaune) or TestBit(codebin,jaune_cli) ; + + //effacement du signal combiné par sémaphore suivant condition + if (((Ancralrap and not(ralrap)) or (Ancjau and not(jau))) and (aspect>=8)) then + begin + Sleep(40); + pilote_acc(adresse+semaphore,2,feu) ; + // dessine_feu(adresse); + end; + + ancien_tablo_signalCplx[adresse]:=EtatSignalCplx[adresse]; + + sleep(40); // les commandes entre 2 feux successifs doivent être séparées au minimum de 100 ms + // affichage du premier aspect du signal(1er bit à 1 dans codebin + pilote_acc(adresse+aspect,2,feu) ; + + + // affichage de la signalisation combinée (2ème bit à 1 dans codebin) + if (CombineLoc<>0) then + begin + sleep(40); + pilote_ACC(adresse+CombineLoc,2,feu) ; + end; + dessine_feu(adresse); + end; +end; + +//évaluation des signaux ancienne version==================================================================*/ +procedure signaux; +var Num_voie,signalCplx,i : integer; + PresTrain,a,b,c : boolean; +begin +// signal 176 =========================================================*/ +signalCplx:=176; +a:=MemZone[524,521] and (aiguillage[8].position=2); +b:=MemZone[514,522] and (aiguillage[8].position<>2); +PresTrain:=MemZone[527,520] or ((aiguillage[7].position<>2) and ( a or b or MemZone[521,527] or MemZone[522,527])); +if (((aiguillage[20].position<>2) and (aiguillage[12].position<>2)) or (PresTrain=FALSE)) then + Maj_Etat_Signal(signalCplx,carre) +else +begin + // si train quitte zone de détection du signal + if ( (MemZone[520,530] and (aiguillage[20].position=2) and (aiguillage[26].position=2)) or + (MemZone[520,529] and (aiguillage[20].position=2) and (aiguillage[26].position<>2)) or + (MemZone[520,517] and (aiguillage[20].position<>2)) ) then + begin + if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin // 26==0 : voie droite <>0 : voie gauche + a:=((aiguillage[20].position<>2) and (testBit(EtatSignalCplx[358],carre)) or (testbit(EtatSignalCplx[358],semaphore))); + b:=((aiguillage[20].position=2) and (testBit(EtatSignalCplx[420],carre)) or (testbit(EtatSignalCplx[420], semaphore))); + + if (a or b) then + begin // si signal complexe suivant est au carré ou sémaphore + Maj_Etat_Signal(signalCplx,jaune); // afficher un avertissement + end + else + begin + if ((aiguillage[11].position<>2) and (aiguillage[20].position<>2) + and (aiguillage[12].position=2) and (aiguillage[18].position<>2)) then // si aiguille suivante prise en pointe est déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30); // afficher ralentissement + end + else + begin + a:=(aiguillage[20].position<>2) and testbit(EtatSignalCplx[358],jaune); + b:=((aiguillage[20].position=2) and testbit(EtatSignalCplx[420],jaune)); + if (a or b) then // si signal cplx suivant est jaune + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,jaune_cli); // afficher un avertissement clignotant sur le signal complexe + end + else Maj_Etat_Signal(signalCplx,vert); // sinon afficher un feu vert + end; + end; + end; +end; + +// signal 190 ================================================================ */ +signalCplx:=190; +if memZone[523,526]=true then // si train quite zone de détection du signal + begin + Maj_Etat_Signal(signalCplx,semaphore); // mettre un sémaphore} + end + else + begin + if testBit(EtatSignalCplx[302],carre) or testBit(EtatSignalCplx[302],semaphore) then // si signal complexe suivant= carré ou sémaphore + // Maj_Etat_Signal(signalCplx,jaune); // + Maj_Etat_Signal(signalCplx,semaphore_cli) + else + begin + if (aiguillage[9].position<>2) then // si aiguille suivante déviée? + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if testBit(EtatSignalCplx[302],jaune) then // si signal suivant jaune ? + Maj_Etat_Signal(signalCplx,jaune_cli); + Maj_Etat_Signal(signalCplx,ral_60); // afficher ralentissement + end + else // aiguille 9 droite + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if testBit(EtatSignalCplx[302],jaune_F) then // si signal cplx suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + + +// signal 204 ============================================================*/ + signalCplx:=204; + PresTrain:=(aiguillage[8].position=2) and (MemZone[521,527] or MemZone[524,521]) + or ((aiguillage[8].position<>2) and (MemZone[522,527] or MemZone[514,522] or MemZone[518,514])); + if (PresTrain=FALSE) then Maj_Etat_Signal(signalCplx,carre) // si pas de train avant le signal, mettre au carré + else + begin + if ( (MemZone[527,520] and (aiguillage[7].position<>2)) or + (MemZone[527,519] and (aiguillage[7].position=2)) ) then // si train quitte détection signal + begin + if (TestBit(EtatSignalCplx[signalCplx],carre)=FALSE) then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if (aiguillage[7].position<>2) then // aiguille locale prise en pointe déviée? + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,rappel_30); // afficher rappel ralentissement + if (TestBit(EtatSignalCplx[176],carre)) or (testBit(EtatSignalCplx[176],semaphore)) then // si signal complexe suivant rouge + Maj_Etat_Signal(signalCplx,jaune) + else + if TestBit(EtatSignalCplx[176],jaune) then // si signal complexe suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli); + end + else // pas aiguille locale déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + // si signal suivant est rouge + if TestBit(EtatSignalCplx[330],carre) or testBit(EtatSignalCplx[330],semaphore) then Maj_Etat_Signal(signalCplx,jaune) + else + begin + if TestBit(EtatSignalCplx[330],jaune) or TestBit(EtatSignalCplx[330],ral_30) + or TestBit(EtatSignalCplx[330],ral_60) then // si signal suivant est jaune ou ral_30 ou 60 + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; + +// signal 218 ============================================================*/ +signalCplx:=218; +if MemZone[525,528] or MemZone[525,535] then Maj_Etat_Signal(signalCplx,semaphore) // si train quitte zone détection du signal +else + // si signal suivant est rouge + begin + a:=(testBit(EtatSignalCplx[344],carre) or testBit(EtatSignalCplx[344],semaphore)) and (aiguillage[17].position<>2); + b:=(testBit(EtatSignalCplx[392],carre) or testBit(EtatSignalCplx[392],semaphore)) and (aiguillage[17].position=2); + if (a or b) then + begin + Maj_Etat_Signal(signalCplx,jaune); + end + else + begin + // si aiguille distante déviée + if ( ((aiguillage[19].position<>2) or ((aiguillage[19].position=2) and (aiguillage[22].position<>2))) and (aiguillage[17].position<>2) ) then + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30); + end + else + begin + // si signal suivant jaune + EtatSignalCplx[signalCplx]:=0; // raz état du signal + a:=testBit(EtatSignalCplx[344],jaune) and (aiguillage[17].position<>2); + b:=testBit(EtatSignalCplx[392],jaune) and (aiguillage[17].position=2); + if (a or b) then + begin + Maj_Etat_Signal(signalCplx,jaune_cli); + end + else + begin + Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; + +// signal 232 ============================================================*/ +signalCplx:=232; +if ((aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position=2) and (aiguillage[6].position<>0)) then +begin + if detecteur[516] then Maj_Etat_Signal(signalCplx,blanc) + else Maj_Etat_Signal(signalCplx,blanc_cli) +end +else Maj_Etat_Signal(signalCplx,violet); + +// signal 260 ============================================================*/ +signalCplx:=260; +// aiguilles vers manoeuvre +//i:=index_feu(SignalCplx); +//a:=(feux[i].check.checked=true) and (aiguillage[1].position<>2) and (aiguillage[3].position<>2) and (aiguillage[5].position=2) and detecteur[518]; +//b:=(aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position=2) and (aiguillage[6].position<>2); +//if (a or b) then Maj_Etat_Signal(signalCplx,blanc) // feu blanc +//else + begin + // équations de présence train avant signal + a:= MemZone[525,528] and (aiguillage[17].position<>2) and (aiguillage[10].position<>2); + b:= MemZone[526,513] and (aiguillage[10].position<>2); + PresTrain:=(a or b or MemZone[513,518] or MemZone[528,518]) and (aiguillage[19].position<>2); + + // équations d'aiguillages prises en talon mal positionnées + a:=((aiguillage[1].position<>2) and (aiguillage[3].position<>2) and (aiguillage[5].position<>2)); + b:=((aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position=2) and (aiguillage[6].position=2)); + a:=false;b:=false;prestrain:=true; + if (a or b or (PresTrain=FALSE)) then maj_Etat_Signal(signalCplx,carre) + else + begin //si train quitte zone 518 + a:=((MemZone[518,523] and (aiguillage[1].position=2)) or + (MemZone[518,515] and (aiguillage[1].position<>2) and (aiguillage[3].position<>2)) or + (MemZone[518,514] or MemZone[514,522]) and ((aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position<>2))); + if a then + begin + if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if feux[index_feu(signalCplx)].check.checked then Maj_Etat_Signal(signalCplx,blanc) + else + begin + if (aiguillage[1].position<>2) then // aiguille locale prise en pointe déviée? + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,rappel_30); // afficher rappel ralentissement + a:=((aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position<>2)) // vers voie 514 + and (testBit(EtatSignalCplx[288],carre) or testBit(EtatSignalCplx[288],semaphore)) ; // si signal complexe suivant rouge + b:=((aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position=2)) ; //ou voie en buttoir + if (a or b) then + Maj_Etat_Signal(signalCplx,jaune) + else + begin + if testBit(EtatSignalCplx[288],jaune) then // si signal complexe suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli); + end; + end + else // pas aiguille locale déviée + begin + // si signal suivant est rouge + EtatSignalCplx[signalCplx]:=0; // raz état du signal + a:=(aiguillage[1].position=2) and testBit(EtatSignalCplx[190],semaphore) or testBit(EtatSignalCplx[190],semaphore_cli) or testbit(EtatSignalCplx[190],carre); + //a:=a or (aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position=2) and (aiguillage[6].position<>2); + //a:=a or (aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position<>2) and TestBit(EtatSignalCplx[288],semaphore) or testBit(EtatSignalCplx[288],carre); + if a then Maj_Etat_Signal(signalCplx,jaune) + else + begin + if testBit(EtatSignalCplx[190],jaune) or testBit(EtatSignalCplx[190],ral_30) + or testBit(EtatSignalCplx[190],ral_60) then // si signal cplx suivant est jaune ou ral_30 ou 60 + Maj_Etat_Signal(signalCplx,jaune_cli) + else + begin + i:=Index_feu(signalCplx); + if feux[i].FeuBlanc then + begin + if feux[i].check.Checked then + Maj_etat_signal(signalCplx,blanc) else Maj_etat_signal(signalCplx,vert); + end + else Maj_etat_signal(signalCplx,vert); + end; + end; + end; + end; + end; + end; + end; + +// signal 274 ============================================================*/ + signalCplx:=274; + if MemZone[524,521] then // si train quite détection du signal + Maj_Etat_Signal(signalCplx,semaphore) + else + begin + if TestBit(EtatSignalCplx[600],carre) or testBit(EtatSignalCplx[600],semaphore) then + Maj_Etat_Signal(signalCplx,jaune) + else + begin + if testBit(EtatSignalCplx[600],ral_30) or testBit(EtatSignalCplx[600],jaune) then Maj_Etat_Signal(signalCplx,jaune_cli) + else + Maj_Etat_Signal(signalCplx,vert); + end; + end; + +// signal 288 =========================================================*/ +signalCplx:=288; +PresTrain:=MemZone[513,531] or MemZone[528,531] or MemZone[524,531] or MemZone[518,514] or MemZone[531,518] ; +//PresTrain:=(PresTrain and (aiguillage[1].position<>2) and (aiguillage[3].position=2) and (aiguillage[4].position<>2) ); +PresTrain:=PresTrain or MemZone[514,522]; + +if ((PresTrain=FALSE) or (aiguillage[8].position=2)) then Maj_Etat_Signal(signalCplx,carre) +else +begin + if MemZone[522,527] then + begin + if TestBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); // sinon mettre un sémaphore} + end + else + begin + if TestBit(EtatSignalCplx[204],carre) or testBit(EtatSignalCplx[204],semaphore) then // si signal complexe suivant est au carré ou sémaphore + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,jaune); // afficher un avertissement + end + else + begin + if (aiguillage[7].position<>2) then // si aiguille suivante prise en pointe est déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30); // afficher ralentissement + end + else + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if testBit(EtatSignalCplx[204],jaune) then // si signal suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli) // afficher un avertissement clignotant sur le signal complexe + else Maj_Etat_Signal(signalCplx,vert); // sinon afficher un feu vert + end; + end; + end; +end; + +// signal 302 ============================================================*/ +signalCplx:=302; +PresTrain:=((MemZone[513,518] or MemZone[528,518] or MemZone[524,518]) and (aiguillage[1].position=2)) or MemZone[518,523] or MemZone[523,526] ; +if PresTrain=FALSE then Maj_Etat_Signal(signalCplx,carre) +else +begin + if (MemZone[526,513] and (aiguillage[9].position=2)) or + (MemZone[526,515] and (aiguillage[9].position<>2)) then // si train quitte zone de détection du signal + begin + if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then + Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if (aiguillage[9].position<>2) then // si aiguille locale déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,rappel_60); // afficher rappel ralentissement + if (testBit(EtatSignalCplx[316],carre) or testBit(EtatSignalCplx[316],semaphore )) then // si signal suivant rouge + Maj_Etat_Signal(signalCplx,jaune); + // signal suivant jaune avec aiguille locale déviée + if testBit(EtatSignalCplx[316],jaune) then // si signal cplx suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli); + end + else // si aiguille locale non déviée + begin + // si signal suivant rouge + if testBit(EtatSignalCplx[462],semaphore) or testBit(EtatSignalCplx[462],carre) then + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,jaune); + end + else + begin + // si aiguille suivante prise en pointe déviée + if ((aiguillage[19].position<>2) or ((aiguillage[19].position=2) and (aiguillage[22].position<>2))) then + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,jaune); // le ral30 est remplacé par avertissement sur ce signal + end + else + // si signal suivant est jaune ou ralentissement 30 + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if (testBit(EtatSignalCplx[462],jaune) or testBit(EtatSignalCplx[462],ral_30)) then + Maj_Etat_Signal(signalCplx,jaune_cli) + else + Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; +end; + +// signal 316 ============================================================*/ +signalCplx:=316; +// aiguillages vers voies de garage +if ( (aiguillage[5].position=2) and (aiguillage[3].position<>2) and (aiguillage[1].position<>2) ) or + ( feux[index_feu(signalCplx)].check.checked) then + begin + if detecteur[518] then Maj_Etat_Signal(signalCplx,blanc_cli) else Maj_Etat_Signal(signalCplx,blanc) ; + end +else +begin + PresTrain:=MemZone[526,515] or (((MemZone[518,523] and (aiguillage[1].position=2)) or MemZone[523,526]) and (aiguillage[9].position<>2)) ; + // équations d'aiguillages mal positionnés + + a:=((aiguillage[5].position=2) and (aiguillage[3].position=2)) or + ((aiguillage[5].position=2) and (aiguillage[1].position=2)) or + ((aiguillage[5].position<>2) and (aiguillage[2].position=2)) or + ((aiguillage[5].position<>2) and (aiguillage[2].position<>2) and (aiguillage[12].position=2)) ; + if a or (PresTrain=FALSE) then Maj_Etat_Signal(signalCplx,carre) + else + begin // train quitte zone de détection du signal + if ( (MemZone[515,517] and (aiguillage[5].position<>2)) or + (MemZone[515,518] and (aiguillage[5].position=2)) ) then + begin + if TestBit(EtatSignalCplx[signalCplx],carre)=false then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if feux[index_feu(signalCplx)].check.checked then Maj_Etat_Signal(signalCplx,blanc) + else + begin + if ( ((aiguillage[5].position<>2) and (aiguillage[2].position<>2)) and + (testBit(EtatSignalCplx[358],carre) or testBit(EtatSignalCplx[358],semaphore)) ) then // si signalCplx suivant est carré + Maj_Etat_Signal(signalCplx,jaune) + else + if ( ((aiguillage[5].position=2) and (aiguillage[3].position<>2) and (aiguillage[1].position<>2)) and // si signal suivant est rouge + (testBit(EtatSignalCplx[497],carre) or testBit(EtatSignalCplx[497],semaphore)) ) then + Maj_Etat_Signal(signalCplx,jaune) + else + begin + if (((aiguillage[11].position<>2) and (aiguillage[5].position<>2)) or + ((aiguillage[10].position<>2) and (aiguillage[5].position=2)) ) then + // si aiguille suivante prise en pointe est déviée + Maj_Etat_Signal(signalCplx,ral_30) // afficher ralentissement + + else + begin + // si aiguille suivante en pointe est déviée + if ((aiguillage[29].position<>2) and (aiguillage[5].position=2)) then// si aiguille suivante prise en pointe est déviée + begin + Maj_Etat_Signal(signalCplx,ral_60); // afficher ralentissement 60 + end + else + begin + // si signal suivant est jaune + if ( ((aiguillage[5].position=2) and (aiguillage[3].position<>2) and (aiguillage[1].position<>2)) and + (testBit(EtatSignalCplx[497],jaune)) ) then + Maj_Etat_Signal(signalCplx,jaune_cli) + else + if ( ((aiguillage[5].position<>2) and (aiguillage[2].position<>2)) and + (testBit(EtatSignalCplx[358],jaune)) ) then + Maj_Etat_Signal(signalCplx,jaune_cli) + else + Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; + end; + end; +end; + + +signalCplx:=330; //-------------------------------------------------------------------- +a:=MemZone[521,527] or MemZone[524,521] ; // and (aiguillage[8].position=0)) ; +b:=MemZone[522,527] or MemZone[514,522] or MemZone[518,514] or MemZone[514,522]; // and (aiguillage[8].position=0)) ; ///à voirrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr +PresTrain:=MemZone[527,519] or ( (aiguillage[7].position=2) and (a or b)); + +// aiguilles 2 et 12 mal positionnées ou pas de train + if (aiguillage[2].position=1) or (aiguillage[12].position=2) or (PresTrain=FALSE) then + Maj_Etat_Signal(signalCplx,carre) // mettre un carré} + else + begin + //if (Mem_519_517=true) then + if MemZone[519,517] then + begin + if (testbit(EtatSignalCplx[signalCplx],carre)=FALSE) then Maj_Etat_Signal(signalCplx,semaphore); // sinon mettre un sémaphore} + end + else + begin + if (testbit(EtatSignalCplx[358],carre)) or (testbit(EtatSignalCplx[358],semaphore)) then // si signal complexe suivant est au carré ou sémaphore + Maj_Etat_Signal(signalCplx,jaune) // afficher un avertissement + else + begin + if (aiguillage[11].position<>2) then // si aiguille suivante prise en pointe est déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30); // afficher ralentissement + end + else + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if testbit(EtatSignalCplx[358],jaune) then // si signal suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli) // afficher un avertissement clignotant sur le signal complexe + else Maj_Etat_Signal(signalCplx,vert); // sinon afficher un feu vert + end; + end; + end; + end; + + +// signal 344============================================================*/ +signalCplx:=344; +PresTrain:=(MemZone[525,528] or MemZone[517,525] or MemZone[534,525] or MemZone[538,525]) and (aiguillage[17].position<>2); + +if (((aiguillage[10].position=2) or (aiguillage[10].position<>2) and (aiguillage[19].position=2) and + (aiguillage[22].position<>2) and (aiguillage[24].position<>2)) + or (PresTrain=FALSE) ) then // si aiguillage 10 non dévié ou pas de train avant signal + Maj_Etat_Signal(signalCplx,carre) // mettre un carré} +else +begin + if ( (MemZone[528,518] and (aiguillage[19].position<>2)) or + (MemZone[528,537] and (aiguillage[19].position=2) and (aiguillage[22].position=2)) or + (MemZone[528,538] and (aiguillage[19].position=2) and (aiguillage[22].position<>2)) ) then + begin + if (testbit(EtatSignalCplx[signalCplx],carre)=FALSE) then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if ((aiguillage[19].position<>2) or (aiguillage[22].position<>2)) then // aiguilles locales déviées + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,rappel_30); + // si aiguilles distantes déviée ou signal distant rouge -> avertissement + a:=((aiguillage[19].position<>2) and ((aiguillage[1].position<>2) or testBit(EtatSignalCplx[260],semaphore) or testBit(EtatSignalCplx[260],carre))) ; + b:=((aiguillage[22].position<>2) and ((aiguillage[11].position<>2) or testBit(EtatSignalCplx[477],semaphore) or testBit(EtatSignalCplx[477],carre))) ; + if a or b then begin Maj_Etat_Signal(signalCplx,jaune);end + else + begin + // si signal suivant est jaune + a:=((aiguillage[19].position<>2) and testbit(EtatSignalCplx[260],jaune)) ; + b:=(((aiguillage[19].position=2) and (aiguillage[22].position=2)) and testBit(EtatSignalCplx[420],jaune)) ; + c:=(((aiguillage[19].position=2) and (aiguillage[22].position<>2)) and testBit(EtatSignalCplx[476],jaune)) ; + if (a or b or c) then begin Maj_Etat_Signal(signalCplx,jaune_cli);end; // si signal complexe suivant = jaune + end; + end + else + begin // aiguilles locales non déviées + EtatSignalCplx[signalCplx]:=0; // raz état du signal + a:=((aiguillage[19].position<>2) and (testBit(EtatSignalCplx[260],carre) or testBit(EtatSignalCplx[260],semaphore))) ; + b:=(((aiguillage[19].position=2) and (aiguillage[22].position=2)) and (testBit(EtatSignalCplx[420],carre) or testBit(EtatSignalCplx[434],semaphore))) ; + c:=(((aiguillage[19].position=2) and (aiguillage[22].position<>2)) and (testBit(EtatSignalCplx[476],carre) or testBit(EtatSignalCplx[476],semaphore))) ; + if (a or b or c) then // si signalCplx suivant au rouge + Maj_Etat_Signal(signalCplx,jaune) + else + begin + if aiguillage[11].position<>2 then // avant : 11 si aiguille suivante prise en pointe est déviée + begin + Maj_Etat_Signal(signalCplx,ral_30); // afficher ralentissement + end + else + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + a:=((aiguillage[19].position<>2) and testBit(EtatSignalCplx[260],jaune)) ; + b:=((aiguillage[19].position=2) and (aiguillage[22].position=2) and testBit(EtatSignalCplx[420],jaune) ) ; + c:=((aiguillage[19].position=2) and (aiguillage[22].position<>2) and testBit(EtatSignalCplx[476],jaune) ) ; + if (a or b or c) then // si signal suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; +end; + +// signal 358============================================================*/ + signalCplx:=358; + PresTrain:=MemZone[519,517] or MemZone[515,517] or MemZone[520,517] or MemZone[521,527] or MemZone[522,527] or + (MemZone[527,519] and (aiguillage[7].position=2)) or + (MemZone[526,515] and (aiguillage[9].position<>2)) or + (MemZone[527,520] and (aiguillage[7].position<>2) and (aiguillage[20].position<>2) and (aiguillage[12].position=2)) ; + if ((PresTrain=FALSE) or (aiguillage[18].position=2)) then Maj_Etat_Signal(signalCplx,carre) + else + begin + if MemZone[517,524] or MemZone[517,525] then + begin + if (testBit(EtatSignalCplx[signalCplx],carre)=FALSE) then // si train quite zone de détection du signal + Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if (aiguillage[11].position<>2) then // si aiguille locale déviée + begin + EtatSignalCplx[signalCplx]:=0; + Maj_Etat_Signal(signalCplx,rappel_30); // afficher rappel ralentissement + if testBit(EtatSignalCplx[218],semaphore) then // si signal suivant rouge + Maj_Etat_Signal(signalCplx,jaune); + if testBit(EtatSignalCplx[218],jaune) then // si signal suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli); + end + else + begin + EtatSignalCplx[signalCplx]:=0; + if testBit(EtatSignalCplx[274],semaphore) or testBit(EtatSignalCplx[274],carre) then // si signal suivant est jaune + Maj_Etat_Signal(signalCplx,jaune) + else + begin + if TestBit(EtatSignalCplx[274],jaune) then + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; + +// signal 392 ============================================================*/ +signalCplx:=392; +if MemZone[535,533] then // si train quite détection du signal + Maj_Etat_Signal(signalCplx,semaphore) +else + if testBit(EtatSignalCplx[448],carre) or testBit(EtatSignalCplx[448],semaphore) then Maj_Etat_Signal(signalCplx,jaune) + else + if testBit(EtatSignalCplx[448],ral_30) or testBit(EtatSignalCplx[448],jaune) then Maj_Etat_Signal(signalCplx,jaune_cli) + else + Maj_Etat_Signal(signalCplx,vert_cli); + + + +// signal 420 =================================================================== +// signal regroupant 3 voies à revoir +// numéro de la voie en fonction de le position de l'aiguillage +if (aiguillage[25].position=2) then num_voie:=1 else + if (aiguillage[27].position=2) then num_voie:=2 else num_voie:=3; +signalCplx:=420; + +PresTrain:=(num_voie<=2) and MemZone[527,520] and (aiguillage[7].position<>2); +PresTrain:=((num_voie=1) and MemZone[520,529]) or PresTrain; +PresTrain:=((num_voie=2) and MemZone[520,530]) or PresTrain; +PresTrain:=((MemZone[521,527] or MemZone[522,527]) and (aiguillage[7].position<>2)) or PresTrain; +PresTrain:=((num_voie=3) and (MemZone[513,537] or (MemZone[526,513] and (aiguillage[10].position=2) and (aiguillage[19].position=2) and (aiguillage[22].position=2)) or MemZone[528,537] or MemZone[524,537])) or PresTrain; + +//if (((Mem_520_529) &&(num_voie!=1)) || ((Mem_520_530) && (num_voie!=2)) || +// ((Mem_528_537 || Mem_513_537 || Mem_524_537) &&(num_voie!=3)) +// && (aiguillage[31]!=0) || +if (PresTrain=FALSE) then Maj_Etat_Signal(signalCplx,carre) +else +begin + if ( ((num_voie=1) and MemZone[529,534]) or + ((num_voie=2) and MemZone[530,534]) or + ((num_voie=3) and MemZone[537,534]) ) then + begin + if TestBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if testBit(EtatSignalCplx[406],semaphore) or testBit(EtatSignalCplx[406],carre) then // si signal cplx suivant est rouge Maj_Etat_Signal(signalCplx,jaune); + else + begin + if aiguillage[11].position<>2 then // si aiguille suivante est déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30) ; + end + else + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if testBit(EtatSignalCplx[406],jaune_F) or testBit(EtatSignalCplx[406],ral_60_F) then //si signal cplx suivant est jaune ou ralentissement----------- Maj_Etat_Signal(signalCplx,jaune_cli); + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; +end; + + +// signal 448 =================================================================== + signalCplx:=448; + PresTrain:=(MemZone[517,525] and (aiguillage[17].position=2)) or MemZone[525,535] or MemZone[535,533]; + if (aiguillage[24].position=2) or (PresTrain=FALSE) then Maj_Etat_Signal(signalCplx,carre) + else + begin + if MemZone[533,538] then //si train quitte zone de détection du signal + begin + if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if testBit(EtatSignalCplx[476],carre) or testBit(EtatSignalCplx[476],semaphore) then // si signal suivant rouge + begin + Maj_Etat_Signal(signalCplx,jaune); + end + else + begin + if (aiguillage[11].position<>2) then // si aiguille suivante prise en pointe est déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30); // afficher ralentissement + end + else + begin // cas si aiguille suivante prise en pointe pas déviée + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if testBit(EtatSignalCplx[476],jaune) then //si signal suivant est jaune----------- + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; +end; + +// signal 462 ============================================================*/ +signalCplx:=462; +PresTrain:=MemZone[526,513] or ((MemZone[523,526] or MemZone[518,523]) and (aiguillage[9].position=2)) ; +// si aiguillages pris en talon mal positionnés ou pas de train avant signal +if (aiguillage[10].position<>2) or (aiguillage[29].position<>2) or (PresTrain=FALSE) then + Maj_Etat_Signal(signalCplx,carre) // mettre un carré} +else +begin + // si présence train après le signal (3 directions à tester) et signal <> carré + if ( MemZone[513,518] and (aiguillage[19].position<>2)) or + ( MemZone[513,537] and (aiguillage[19].position=2) and (aiguillage[22].position=2)) or + ( MemZone[513,538] and (aiguillage[19].position=2) and (aiguillage[22].position<>2)) then + begin + if TestBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if (aiguillage[19].position<>0) or (aiguillage[22].position<>2) then // si aiguilles locales déviées + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,rappel_30); + // si aiguilles distantes déviées ou signal distant rouge -> avertissement + a:=(aiguillage[19].position<>2) and ((aiguillage[1].position<>2) or testBit(EtatSignalCplx[260],semaphore) or testBit(EtatSignalCplx[260],carre)); + b:=(aiguillage[22].position<>2) and ((aiguillage[11].position<>2) or testBit(EtatSignalCplx[477],semaphore) or testBit(EtatSignalCplx[477],carre)); + if (a or b) then + Maj_Etat_Signal(signalCplx,jaune) + else + begin // si signal distant est jaune + a:=((aiguillage[19].position<>2) and testBit(EtatSignalCplx[260],jaune)) ; + b:=(((aiguillage[19].position=2) and (aiguillage[22].position=2)) and testbit(EtatSignalCplx[420],jaune)) ; + c:=(((aiguillage[19].position=2) and (aiguillage[22].position<>2)) and testbit(EtatSignalCplx[476],jaune)) ; + if (a or b or c) then Maj_Etat_Signal(signalCplx,jaune_cli); // si signal complexe suivant = jaune + end; + end + else + begin // aiguilles locales en position droite + EtatSignalCplx[signalCplx]:=0; // raz état du signal + a:=((aiguillage[19].position<>0) and testBit(EtatSignalCplx[260],carre) or TestBit(EtatSignalCplx[260],semaphore)) ; + b:=(((aiguillage[19].position<>0) and (aiguillage[22].position=2)) and TestBit(EtatSignalCplx[420],carre) or TestBit(EtatSignalCplx[434],semaphore)) ; + c:=(((aiguillage[19].position=2) and (aiguillage[22].position<>0)) and testbit(EtatSignalCplx[476],carre) or TestBit(EtatSignalCplx[476],semaphore)) ; + if (a or b or c) then // si signalCplx suivant au rouge + Maj_Etat_Signal(signalCplx,jaune) + else + begin + // aiguilles locales en position droite + if (aiguillage[11].position<>2) then // si aiguille suivante prise en pointe est déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30); // afficher ralentissement + end + else + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + a:=((aiguillage[19].position<>2) and TestBit(EtatSignalCplx[260],jaune)) ; + b:=((aiguillage[19].position=2) and (aiguillage[22].position=2) and TestBit(EtatSignalCplx[420],jaune) ) ; + c:=((aiguillage[19].position=2) and (aiguillage[22].position<>2) and TestBit(EtatSignalCplx[476],jaune) ) ; + if (a or b or c) then // si signal CDM suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; +end; + +// signal 476 ============================================================*/ + signalCplx:=476; + PresTrain:=MemZone[533,538] or MemZone[535,533] or MemZone[525,535]; + PresTrain:=MemZone[528,538] or MemZone[513,538] or MemZone[524,538] or PresTrain; + + if ((((aiguillage[23].position<>2) or (aiguillage[18].position<>2)) or + ((aiguillage[30].position<>2) or (aiguillage[11].position=2) or (aiguillage[23].position=2)) ) or (PresTrain=FALSE)) then Maj_Etat_Signal(signalCplx,carre) + else + begin + if MemZone[538,524] or MemZone[538,525] then //si train quitte signal + begin + if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if (aiguillage[11].position<>2) then // si aiguille locale déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état complet + Maj_Etat_Signal(signalCplx,rappel_30); // afficher rappel ralentissement + if testBit(EtatSignalCplx[218],semaphore) then // si signal suivant rouge + Maj_Etat_Signal(signalCplx,jaune) + else + begin + if testbit(EtatSignalCplx[218],jaune) or testBit(EtatSignalCplx[218],ral_30) then // si signal suivant est jaune ou ral30 begin Maj_Etat_Signal(signalCplx,jaune_cli);end; + end; + end + else + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if testbit(EtatSignalCplx[274],jaune) then // si signal suivant est jaune + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end ; + + // signal 497 ============================================================*/ + signalCplx:=497; + //memZone[523,518]:=true; + PresTrain:=MemZone[518,531] or MemZone[523,518] or MemZone[515,518] or MemZone[514,518] or + MemZone[526,523]; + //PresTrain:=true; + //if PresTrain then Affiche('prestrain',clorange); + // équations aiguillages mal positionnés + if ((aiguillage[19].position<>1) or // 1 = dévié + ((aiguillage[19].position=1) and (aiguillage[10].position=2) and (aiguillage[29].position=1) and (aiguillage[30].position<>1)) or + (PresTrain=FALSE)) then + Maj_Etat_Signal(signalCplx,carre) + else + begin + if MemZone[531,528] or MemZone[531,528] or MemZone[531,513] or MemZone[531,524] then //si train quitte signal + begin + if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if (aiguillage[10].position<>2) then // si aiguille locale déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état complet + Maj_Etat_Signal(signalCplx,rappel_30); // afficher rappel ralentissement + //if testBit(EtatSignalCplx[xx],semaphore) then // si signal suivant rouge + // Maj_Etat_Signal(signalCplx,jaune) + //else + //begin + // if testbit(EtatSignalCplx[218],jaune) or testBit(EtatSignalCplx[218],ral_30) then // si signal suivant est jaune ou ral30 // begin Maj_Etat_Signal(signalCplx,jaune_cli);end; + //end; + end + else + if (aiguillage[29].position<>2) then + begin + EtatSignalCplx[signalCplx]:=0; // raz état complet + Maj_Etat_Signal(signalCplx,rappel_60); // afficher rappel ralentissement + if testBit(EtatSignalCplx[274],semaphore) then // si signal suivant rouge + Maj_Etat_Signal(signalCplx,jaune) + else if testbit(EtatSignalCplx[274],jaune) then // si signal suivant est jaune ou ral30 + begin Maj_Etat_Signal(signalCplx,jaune_cli);end; + end + else + begin // aiguilles locales non déviées + //EtatSignalCplx[xx]:=0; // raz état du signal + //if testbit(EtatSignalCplx[xx],jaune) then // si signal suivant est jaune + // Maj_Etat_Signal(signalCplx,jaune_cli) + //else + Maj_Etat_Signal(signalCplx,vert); + end; + end; + end ; + + +// signal 600 =====================================================*/ +signalCplx:=600; +PresTrain:=MemZone[524,521] or MemZone[517,524] or MemZone[538,524] or MemZone[534,524]; + +//if ((aiguillage[8].position<>2) or (PresTrain=FALSE)) then Maj_Etat_Signal(signalCplx,carre) +//else + begin + if MemZone[521,527] then + begin + if (testBit(EtatSignalCplx[signalCplx],carre)=FALSE) then Maj_Etat_Signal(signalCplx,semaphore); + end + else + begin + if testBit(EtatSignalCplx[204],semaphore) or testBit(EtatSignalCplx[204],carre) then // si signal cplx suivant est rouge + Maj_Etat_Signal(signalCplx,jaune) + else + begin + if (aiguillage[7].position<>2) then// si aiguille suivante est déviée + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + Maj_Etat_Signal(signalCplx,ral_30) ; + end + else + begin + EtatSignalCplx[signalCplx]:=0; // raz état du signal + if TestBit(EtatSignalCplx[204],jaune) or testBit(EtatSignalCplx[204],ral_60) then //si signal cplx suivant est jaune ou ralentissement----------- + Maj_Etat_Signal(signalCplx,jaune_cli) + else Maj_Etat_Signal(signalCplx,vert); + end; + end; + end; + end; + +end; // de la procédure pilote signaux + + +// pilotage des signaux +procedure envoi_signauxCplx; +var i,signalCplx : integer; +begin + //Affiche('Envoi des signaux (envoi_signaixCplx)',ClGreen); + //chaque signal doit être appellé en fonction de sa procédure suivant le décodeur + for i:=1 to NbreFeux do + begin + signalCplx:=feux[i].adresse; + if not(ferme) and (signalCplx<>0) then + begin + case feux[i].decodeur of + 0 : envoi_virtuel(signalCplx); + 1 : envoi_signalBahn(signalCplx); + 2 : envoi_CDF(signalCplx); + 3 : envoi_LDT(signalCplx); + 4 : envoi_LEB(signalCplx); + //5 : envoi_NMRA(SignalCplx); + end; + end; + end; +end; + +function virgule_suiv(sl : string;o : integer) : integer; +var k : integer; +begin + o:=o+1; + for k:=o to length(sl) do + begin + // Affiche(sl[k],clGreen); + if sl[k]=',' then begin result:=k;exit;end; + end; + result:=0; +end; + + +// trouve l'enregistrement suivant après l'offset dans une branche +// en sortie : trouve_enregistrement= nouvel offset, enregistrement +// si 0 en sortie: fin de ligne +function trouve_enregistrement_suiv(num_branche : integer;offset : integer) : integer; +var j : integer; + ss : string; +begin + //Affiche(branche[num_branche],clWhite); + j:=virgule_suiv(branche[Num_Branche],offset); // pointe sur la virgule suivante + //Affiche('virgule suivante j='+IntToStr(j),ClOrange); + //Affiche(' j='+IntToStr(j),ClOrange); + if j<>0 then ss:=copy(branche[Num_Branche],offset,j-offset) // champ suivant + else ss:=copy(branche[Num_Branche],offset,length(branche[Num_Branche])-offset+1); // si j=0 c'est la fin de la chaîne + //affiche(ss,clGreen); + enregistrement:=ss; + if j=0 then result:=0 else result:=j+1; +end; + +// trouve l'index d'un détecteur dans une branche +// si pas trouvé, renvoie 0 +function index_detecteur(det,Num_branche : integer) : integer; +var i,adr : integer; + trouve : boolean; + procedure recherche; + begin + repeat + adr:=BrancheN[Num_Branche,i].adresse; + trouve:=(det=adr) and ((BrancheN[Num_Branche,i].Btype=1) or (BrancheN[Num_branche,i].BType=4)); // cherche un détecteur + //Affiche('cherche='+intToSTR(det)+'/explore='+intToSTR(adr)+' Branche='+intToStr(Num_branche)+' index='+intToStr(i),ClWhite); + if not(trouve) then inc(i); + //if trouve then Affiche('Trouvé en branche'+IntToSTR(Num_branche)+' index='+IntToSTR(i),clGreen); + until trouve or (adr=0) ; + end; +begin + i:=1;index2_det:=0; + recherche; + if trouve then result:=i else result:=0; + //affiche(inttostr(ai+1),clOrange); + i:=2; // à voir + //affiche('------------------------',clWhite); + recherche; + //affiche('------------------------',clGreen); + if trouve then index2_det:=i else index2_det:=0; + //affiche('index2='+IntToSTR(index2_det),clWhite); +end; + + +// si pas trouvé, IndexBranche_trouve=0 +procedure trouve_detecteur(detecteur : integer); +var NBranche,i : integer; +begin + Nbranche:=1; + i:=1; + repeat + i:=index_detecteur(detecteur,Nbranche); + if i=0 then inc(NBranche); + until (Nbranche>NbreBranches) or (i<>0); + // if (i<>0) and traceDet then Affiche('Détecteur trouvé en branche '+intToSTR(NBranche)+' index='+IntToSTR(i),clYellow); + branche_trouve:=NBranche; + IndexBranche_trouve:=i; +end; + + +procedure lit_config; +var s,sa,chaine,SOrigine: string; + c,paig : char; + tec,bistec,tjd,tjs,s2,trouve,triple,debugConfig,multiple,fini,finifeux : boolean; + bd,virgule,i_detect,i,erreur,aig,detect,offset,index, adresse,j,position,temporisation,invers,indexPointe,indexDevie,indexDroit, + ComptEl,Compt_IT,Num_Element,k,modele,aig2,adr,erreur2,l : integer; + function lit_ligne : string ; + begin + repeat + readln(fichier,s); + s:=uppercase(s); + //Affiche(s,clWhite); + if length(s)>0 then c:=s[1]; + until ((c<>'/') and (s<>'')) or eof(fichier) ; + lit_ligne:=s; + end; +begin + debugConfig:=false; + // 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].temps:=5 ; + Aiguillage[i].inversion:=0; + end; + for i:=1 to 1024 do + begin + Detecteur[i]:=false; + Ancien_detecteur[i]:=false; + end; + //ChDir(s); + Affiche('lecture du fichier de configuration client-GL.cfg',clyellow); + assign(fichier,'client-GL.cfg'); + reset(fichier); + {lecture du fichier de configuration} + // taille de fonte + s:=lit_ligne; + i:=StrToINT(s); + with FormPrinc.ListBox1 do + begin + Font.Height:=i; + ItemHeight:=i+1; + end; + // adresse ip et port de CDM + // AfficheDet:=true; + s:=lit_ligne; + i:=pos(':',s); + if i<>0 then begin adresseIPCDM:=copy(s,1,i-1);Delete(s,1,i);portCDM:=StrToINT(s);end; + + + // adresse ip et port de la centrale + // AfficheDet:=true; + s:=lit_ligne; + i:=pos(':',s); + if i<>0 then begin adresseIP:=copy(s,1,i-1);Delete(s,1,i);port:=StrToINT(s);parSocket:=True;end + else begin adresseIP:='0';parSocket:=false;end; + + // numéro de port + s:=lit_ligne; + NumPort:=StrToINT(s); + + //avec ou sans initialisation des aiguillages + s:=lit_ligne; + AvecInitAiguillages:=StrToINT(s); + + Affiche('Valeurs d''initialisation des aiguillages',clyellow); + //initialisation aiguillages + repeat + s:=lit_ligne; + j:=pos(',',s); + if j>1 then + begin + adresse:=StrToINT(copy(s,1,j-1));Delete(s,1,j); // adresse aiguillage + if (adresse>0) then + begin + j:=pos(',',s); + position:=StrToInt(copy(s,1,j-1));Delete(S,1,j);// position aiguillage + if (position<1) or (position>2) then position:=1; + aiguillage[adresse].position:=position; + aiguillageB[adresse].position:=position; + + // temporisation aiguillage + j:=pos(',',s); + temporisation:=StrToInt(copy(s,1,j-1));Delete(S,1,j); + if (temporisation<0) or (temporisation>10) then temporisation:=5; + aiguillage[adresse].temps:=temporisation; + aiguillageB[adresse].temps:=temporisation; + + invers:=StrToInt(s); + if (invers<0) or (invers>1) then invers:=0; // inversion commande + aiguillage[adresse].inversion:=invers; + aiguillageB[adresse].inversion:=invers; + + end; + end; + until (adresse=0); + + + + + closefile(fichier); + + + Affiche('lecture du fichier de configuration config.cfg',clyellow); + assign(fichier,'config.cfg'); + reset(fichier); + + s:=Lit_ligne; //variable log non utilisée + s:=Lit_ligne; // trace_det + s:=Lit_ligne; // raz signaux + + + + Affiche('Définition des aiguillages',clyellow); + + // définition des aiguillages dans les branches + maxaiguillage:=0; + repeat + s:=lit_ligne;sOrigine:=s; + //chaine:=s; + if debugconfig then Affiche(s,ClLime); + if (s<>'0') then + begin + virgule:=pos(',',s); + enregistrement:=copy(s,1,virgule-1); // adresse de l'aiguillage [TRI] + delete(s,1,virgule); + triple:=pos('TRI',enregistrement)<>0; + bis:=pos('B',enregistrement)<>0; + tjd:=pos('TJD',enregistrement)<>0; + tjs:=pos('TJS',enregistrement)<>0; + // adresse de l'aiguillage + Val(enregistrement,aig,erreur); // aig = adresse de l'aiguillage + if aig>maxaiguillage then maxaiguillage:=aig; + if debugConfig then Affiche('Adresse='+IntToSTR(aig)+' enregistrement='+Enregistrement,clyellow); + + if not(bis) then begin aiguillage[aig].AdroitB:='Z'; aiguillage[aig].AdevieB:='Z'; aiguillage[aig].ApointeB:='Z'; aiguillage[aig].Adevie2B:='Z';end + else begin aiguillageB[aig].AdroitB:='Z';aiguillageB[aig].AdevieB:='Z';aiguillageB[aig].ApointeB:='Z';aiguillageB[aig].Adevie2B:='Z';end ; + + if (triple) then aiguillage[aig].modele:=4; + if (tjs) then + begin + if not(bis) then aiguillage[aig].modele:=3 + else aiguillageB[aig].modele:=3; + end; + if (tjd) then + begin + if not(bis) then aiguillage[aig].modele:=2 + else aiguillageB[aig].modele:=2; + end; + if not(tjs) and not(tjd) and not(triple) then + begin + if not(bis) then aiguillage[aig].modele:=1 + else aiguillageB[aig].modele:=1; + end; + //if debugConfig then Affiche(s,clyellow); + + if (triple) then + begin + Val(s,aig2,erreur); // aig = 2eme adresse de l'aiguillage + aiguillage[aig].AdrTriple:=aig2; + virgule:=pos(',',s); + delete(s,1,virgule); + end; + ComptEl:=0;Compt_It:=0;Num_element:=Num_element+1; + // préparer l'enregistrement pour la boucle de ligne + virgule:=pos(',',s); + enregistrement:=copy(s,1,virgule-1); + delete(s,1,virgule); + + repeat // parcoure la ligne + if (debugConfig) then Affiche('boucle de ligne: '+s,clYellow); + + if (length(enregistrement)<>0) then + if (enregistrement[1]='P') then + begin + if debugconfig then Affiche('Section P - enregistrement='+enregistrement,clYellow); + ComptEl:=ComptEl+1; + delete(enregistrement,1,1); // supprime le P + detect:=0; + Val(enregistrement,detect,erreur); + if erreur<>0 then delete(enregistrement,1,erreur-1); + //if ((aig=0) and (erreur=0)) then Affiche('Erreur pas d''adresse dans section P: '+chaine,clRed); + if (erreur=0) then enregistrement:=copy(s,1,virgule-1); + if not(bis) then aiguillage[aig].Apointe:=detect else aiguillageB[aig].Apointe:=detect; + if (erreur<>0) then // si erreur<>0 peut être un B ou un S ou un , + begin + if (enregistrement[1]='B') then + begin + if not(bis) then aiguillage[aig].ApointeBis:=1 else aiguillageB[aig].ApointeBis:=1; + delete(enregistrement,1,1); + if (debugConfig) then affiche('connecté a aiguillage BIS'+s,clYellow); + end; + if not(bis) then aiguillage[aig].ApointeB:=enregistrement[1] else aiguillageB[aig].ApointeB:=enregistrement[1]; + delete(enregistrement,1,1); + Num_element:=Num_element+1; + end; + virgule:=pos(',',s);if virgule=0 then virgule:=length(s)+1; + enregistrement:=copy(s,1,virgule-1); + delete(s,1,virgule); + end; + + if (length(enregistrement)<>0) then // section droite + if (enregistrement[1]='D') then + begin + if debugconfig then Affiche('Section D - enregistrement='+enregistrement,clYellow); + ComptEl:=ComptEl+1; + delete(enregistrement,1,1); // supprime le P + detect:=0; + Val(enregistrement,detect,erreur); + if erreur<>0 then delete(enregistrement,1,erreur-1); + if debugconfig then Affiche(enregistrement,clyellow); + //if ((aig=0) and (erreur=0)) then Affiche('Erreur pas d''adresse dans section D: '+chaine,clRed); + if (erreur=0) then enregistrement:=''; + if not(bis) then aiguillage[aig].Adroit:=detect else aiguillageB[aig].Adroit:=detect; + if (erreur<>0) then // si erreur<>0 peut être un B ou un S ou un , + begin + if (enregistrement[1]='B') then + begin + if not(bis) then aiguillage[aig].AdroitBis:=1 else aiguillageB[aig].AdroitBis:=1; + delete(enregistrement,1,1); + if (debugConfig) then affiche('connecté a aiguillage BIS'+s,clYellow); + end; + if (enregistrement[1]<>',') then // copier si c'est S P D + begin + if not(bis) then aiguillage[aig].AdroitB:=enregistrement[1] else aiguillageB[aig].AdroitB:=enregistrement[1]; + delete(enregistrement,1,1); + if (debugConfig) then affiche('connecté a aiguillage BIS'+s,clYellow); + end; + delete(enregistrement,1,1); + Num_element:=Num_element+1; + end; + virgule:=pos(',',s);if virgule=0 then virgule:=length(s)+1; + enregistrement:=copy(s,1,virgule-1); + delete(s,1,virgule); + end; + + if (length(enregistrement)<>0) then + if (enregistrement[1]='S') then + begin + if debugconfig then Affiche('Section S - enregistrement='+enregistrement,clYellow); + ComptEl:=ComptEl+1; + delete(enregistrement,1,1); // supprime le S + erreur:=pos('2-',enregistrement); + S2:=erreur<>0; + if (S2) then delete(enregistrement,erreur,2); + + erreur:=pos('S2',enregistrement); // description d'un rattachement à mla branche S2 d'un aiguillage triple + tec:=erreur<>0; // ne supprimer que le 2 + if (tec) then delete(enregistrement,erreur+1,1); + + erreur:=pos('B',enregistrement); // description d'un rattachement connecté à un aiguillage bis + bistec:=erreur<>0; + if (bistec) then delete(enregistrement,erreur,1); // ne supprime que le B + detect:=0; + val(enregistrement,detect,erreur); // extraction de l'adresse + //if ((detect=0) and (erreur=0)) then Affiche('Erreur pas d''adresse dans section S: '+s,clred); + c:='Z'; + if (erreur<>0) then begin delete(enregistrement,1,erreur-1);c:=enregistrement[1];end; + + if not(bis) and not(bistec) and not(S2) and not(tec) then begin aiguillage[aig].Adevie:=detect;aiguillage[aig].AdevieB:=c;end; + if not(bis) and not(bistec) and S2 and not(tec) then begin aiguillage[aig].Adevie2:=detect;aiguillage[aig].Adevie2B:=c;end; + if not(bis) and not(bistec) and S2 and tec then begin aiguillage[aig].Adevie2:=detect;aiguillage[aig].Adevie2B:='T';end; + if not(bis) and (bistec) and not(S2) and not(tec) then begin aiguillage[aig].Adevie:=detect;aiguillage[aig].AdevieBis:=1;aiguillage[aig].AdevieB:=c;end; + virgule:=pos(',',s);if virgule=0 then virgule:=length(s)+1; + enregistrement:=copy(s,1,virgule-1); + delete(s,1,virgule); + end; + + Val(enregistrement,adr,erreur); + if erreur=0 then + begin + aiguillage[aig].vitesse:=adr; + enregistrement:=''; + end; + + until enregistrement='' ; + end; + until (s='0'); + + Affiche('définition des branches',clyellow); + // branches de réseau + NDetecteurs:=0; + i:=1;i_detect:=1; + repeat + s:=lit_ligne; + //Affiche(s,clWhite); + //adresse:=pos('0',s); + //s:='A16B,557,0' ; + if s<>'0' then + begin + branche[i]:=s; + j:=1;offset:=1; + repeat + BrancheN[i,j].adresse:=0; // préparer le suivant à 0 + offset:=trouve_enregistrement_suiv(i,offset) ; + // décoder l'enregistrement + // si c'est un détecteur, fini trouvé + //affiche(enregistrement,clred); + Val(enregistrement,detect,erreur); // détermine si le champ est numérique ou pas (cad si aiguillage) + //Affiche(enregistrement+'detect='+intToSTR(detect),clyellow); + + // il y a un aiguillage ou un espace après le champ....en fin de ligne + if erreur<>0 then + begin + c:=enregistrement[1]; + delete(enregistrement,1,1); + if c='A' then + begin + Val(enregistrement,adresse,erreur2); + //Affiche(IntToSTR(adresse),clyellow); + BrancheN[i,j].adresse:=adresse; + k:=pos('B',enregistrement); + if k=0 then BrancheN[i,j].btype:=2 else BrancheN[i,j].btype:=3; // ident aiguillage + end + else erreur:=0; // forcer erreur à 0 pour obliger à passer sur un détecteur + end; + + // détecteur + if erreur=0 then + begin + //Affiche(IntToSTR(detect),clyellow); + //Affiche(s,clorange); Affiche(IntToStr(detect),clorange); + BrancheN[i,j].adresse:=detect; // adresse + BrancheN[i,j].btype:=1;// ident détecteur + if detect=0 then begin BrancheN[i,j].btype:=4;end; // buttoir + //if j=1 then Affiche('Erreur la ligne doit commencer par un aiguillage: '+s,clred); + //if (offset=-1) then Affiche('Erreur la ligne soit se terminer par un aiguillage:'+s,clred); + // vérifier si le détecteur est déja stocké + bd:=0; + repeat + inc(bd); + trouve:=Adresse_detecteur[bd]=detect; + until ((bd=NDetecteurs+1) or trouve) ; + if not(trouve) then + begin + Adresse_detecteur[bd]:=detect; + NDetecteurs:=bd; + end; + end; + inc(j); + BrancheN[i,j].adresse:=0; // préparer le suivant à 0 + //Affiche('branche '+intToSTR(i)+' index='+intToStr(j),clGreen); + until (offset=0); + inc(i); + end; + until (s='0'); + NbreBranches:=i-1; + //Affiche(IntToSTR(NbreBranches)+' branches',clYellow); + + // feux + Affiche('Définition des feux',clyellow); + i:=1; + repeat + s:=lit_ligne; + //Affiche(s,clYellow); + finifeux:=s[1]='0'; + if not(finifeux) then + begin + chaine:=s; + j:=pos(',',s); + if j>1 then + begin + + adresse:=StrToINT(copy(s,1,j-1));Delete(s,1,j); // adresse de feu + //if (adresse0) then adresse:=1000; + feux[i].adresse:=adresse; + j:=pos(',',s); + if j>1 then begin feux[i].aspect:=StrToInt(copy(s,1,j-1));Delete(s,1,j);end; + j:=pos(',',s); + if j>1 then begin Feux[i].FeuBlanc:=(copy(s,1,j-1))='1';delete(s,1,j);end; + j:=pos(',',s); + if j=0 then begin Feux[i].decodeur:=StrToInt(s);end else begin Feux[i].decodeur:=StrToInt(copy(s,1,j-1));delete(s,1,j);end; + feux[i].Adr_el_suiv1:=0;feux[i].Adr_el_suiv2:=0;feux[i].Adr_el_suiv3:=0;feux[i].Adr_el_suiv4:=0; + feux[i].Btype_Suiv1:=0;feux[i].Btype_Suiv2:=0;feux[i].Btype_Suiv3:=0;feux[i].Btype_Suiv4:=0; + feux[i].Adr_det1:=0;feux[i].Adr_det2:=0;feux[i].Adr_det3:=0;feux[i].Adr_det4:=0; + // éléments optionnels + if j<>0 then + begin + //Affiche('Entrée:s='+s,clyellow); + sa:=s; + multiple:=s[1]='('; + if multiple then + begin + delete(s,1,1); + j:=0; + repeat + k:=pos(',',s); + if k>1 then + begin + val(s,adr,erreur); // extraire l'adresse + Delete(s,1,k); + end; + + //Affiche('Adr='+IntToSTR(adr)+' ' +intToSTR(erreur),clyellow); + //Affiche('S avec premier champ supprimé='+s,clyellow); + inc(j); + if (j=1) then feux[i].Adr_det1:=adr; + if (j=2) then feux[i].Adr_det2:=adr; + if (j=3) then feux[i].Adr_det3:=adr; + if (j=4) then feux[i].Adr_det4:=adr; + //type de l'élément suivant (1=détecteur 2=aig ou TJD ou TJS 4=tri 5=bis + if s[1]='A' then + begin + //Affiche('détecté aiguillage',clyellow); + if (j=1) then feux[i].Btype_Suiv1:=2; + if (j=2) then feux[i].Btype_Suiv2:=2; + if (j=3) then feux[i].Btype_Suiv3:=2; + if (j=4) then feux[i].Btype_Suiv4:=2; + delete(s,1,1); + end; + l:=pos('TRI',s); + if l<>0 then + begin + delete(s,l,3); + //Affiche('détecté aiguillage tri',clyellow); + if (j=1) then feux[i].Btype_Suiv1:=4; + if (j=2) then feux[i].Btype_Suiv2:=4; + if (j=3) then feux[i].Btype_Suiv3:=4; + if (j=4) then feux[i].Btype_Suiv4:=4; + end; + l:=pos('B',s); + if l<>0 then + begin + delete(s,l,1); + //Affiche('détecté aiguillage bis',clyellow); + if (j=1) then feux[i].Btype_Suiv1:=5; + if (j=2) then feux[i].Btype_Suiv2:=5; + if (j=3) then feux[i].Btype_Suiv3:=5; + if (j=4) then feux[i].Btype_Suiv4:=5; + end; + Val(s,adr,erreur); + //Affiche('Adr='+IntToSTR(Adr),clyellow); + if (j=1) then feux[i].Adr_el_suiv1:=Adr; + if (j=2) then feux[i].Adr_el_suiv2:=Adr; + if (j=3) then feux[i].Adr_el_suiv3:=Adr; + if (j=4) then feux[i].Adr_el_suiv4:=Adr; + delete(s,1,erreur-1); + if s[1]=',' then delete(s,1,1); + //Affiche('S en fin de traitement s='+s,clyellow); + fini:=s[1]=')'; + until (fini) or (j>4); + //if fini then Affiche('fini',clyellow); + end; + if (j>4) or (not(multiple)) then begin Affiche('Erreur: fichier de configuration ligne erronnée : '+chaine,clred); closefile(fichier);exit;end; + + k:=pos(',',s); + delete(s,1,k); + //Affiche('s='+s,clyellow); + feux[i].VerrouCarre:=s[1]='1'; + end; + inc(i); + end; + end; + until (finifeux); + NbreFeux:=i-1; if NbreFeux<0 then NbreFeux:=0; + //Affiche('Nombre de feux='+IntToSTR(NbreFeux),clYellow); + + //Affiche(IntToStr(NbreBranches)+' branches',clwhite); + closefile(fichier); + // vérification de la cohérence1 + // parcoure les branches des détecteurs jusqu'à trouver un aiguillage pour voir s'il a été décrit + for i:=1 to NbreBranches do + begin + j:=1; + repeat + detect:=BrancheN[i][j].Adresse; + modele:=BrancheN[i][j].BType; //1= détecteur 2 ou 3 aiguillage + j:=j+1; + until ( (modele=1) or (modele=2) or (modele=3) or ((modele=0) and (detect=0))); + // trouvé un aiguillage et récupéré son adresse dans detect + //if (type!=1) Display("Erreur aucun détecteur dans la déclaration du réseau\r\n"); + if (modele=1) or (modele=2) or (modele=3) then + begin + modele:=aiguillage[detect].modele; + if (modele=0) then Affiche('Erreur 1: Aiguillage='+intToStr(detect)+' non décrit mais présent dans la description des branches '+intToStr(i)+'/'+intToSTR(j),clred); + end; + end; + + // vérification de la cohérence2 + // parcoure les aiguillages pour voir si les détecteurs sont en branches des détecteurs + for aig:=1 to maxaiguillage do + begin + adr:=aiguillage[aig].Adroit; + if (aiguillage[aig].AdroitB='Z') then + begin + trouve_detecteur(adr); // branche_trouve IndexBranche_trouve + if (IndexBranche_trouve=0) then + Affiche('Erreur 2: détecteur '+intToSTR(adr)+' décrit dans l''aiguillage '+intToSTR(aig)+' mais absent dans la description des branches',clred); + end; + adr:=aiguillage[aig].Adevie; + if (aiguillage[aig].AdevieB='Z') then + begin + trouve_detecteur(adr); // branche_trouve IndexBranche_trouve + if (IndexBranche_trouve=0) then + Affiche('Erreur 3: détecteur '+intToSTR(adr)+' décrit dans l''aiguillage '+intToSTR(aig)+' mais absent dans la description des branches',clRed); + end; + adr:=aiguillage[aig].Apointe; + if ((aiguillage[aig].ApointeB='Z') and (aiguillage[aig].modele=1)) then + begin + trouve_detecteur(adr); // branche_trouve IndexBranche_trouve + if (IndexBranche_trouve=0) then + Affiche('Erreur 4 : détecteur '+intToSTR(adr)+' décrit dans l''aiguillage '+intToSTR(aig)+' mais absent dans la description des branches',clRed); + end; + if (aiguillage[aig].modele=4) then // aiguillage triple + begin + if (aiguillage[aig].Adevie2B='Z') then + begin + adr:=aiguillage[aig].Adevie2; + trouve_detecteur(adr); // branche_trouve IndexBranche_trouve + if (IndexBranche_trouve=0) then + Affiche('Erreur 5 : détecteur '+intToSTR(adr)+' décrit dans l''aiguillage '+intToSTR(aig)+' mais absent dans la description des branches',clRed); + end; + end; + end; +end; + +// front descendant sur un détecteur +function detecteur_0(adresse : integer) : boolean; +var res : boolean; +begin + detecteur_0:=(Ancien_detecteur[adresse]=true) and ((detecteur[adresse])=false); + Ancien_detecteur[adresse]:=detecteur[adresse]; +end; + +function detecteur_1(adresse : integer) : boolean; +var fd : boolean; +begin + detecteur_1:=(Ancien_detecteur[adresse]=false) and ((detecteur[adresse])=true); + Ancien_detecteur[adresse]:=detecteur[adresse]; +end; + +function virgule_prec(sl : string;o : integer) : integer; +var k : integer; +begin + o:=o-1; + for k:=o downto 1 do + begin + //Affiche(intToSTR(k)+'/'+sl[k],clGreen); + if sl[k]=',' then begin result:=k;exit;end; + end; + result:=0; +end; + +// trouve un élément dans les branches, renvoie branche_trouve IndexBranche_trouve +procedure trouve_element(el : integer;sibis : boolean); +var i,Btype,adr,Branche : integer ; + s : string; + sort : boolean; +begin + Branche:=1; + branche_trouve:=0; + IndexBranche_trouve:=0; + i:=1; + repeat + adr:=BrancheN[Branche,i].Adresse; + Btype:=BrancheN[Branche,i].BType; + if ((adr=0) and (Btype=0)) then begin inc(Branche);i:=0;end; + inc(i); + sort:=(Branche>NbreBranches) or + ((adr=el) and sibis and (Btype=3)) or + ((adr=el) and not(sibis) and (Btype=2)) or + ((adr=el) and not(sibis) and (Btype=1)) ; + until (sort); + if (adr=el) then + begin + branche_trouve:=Branche; + IndexBranche_trouve:=i-1; + end + else begin s:='Erreur 175 - élément '+intToSTR(el); + if (sibis) then s:=s+'bis'; + s:=s+' non trouvé';Affiche(s,clred); + branche_trouve:=0; IndexBranche_trouve:=0; + if NivDebug>=1 then AfficheDebug(s,clred); + end; +end; + + + +// renvoie élément suivant entre deux éléments quels qu'ils soient mais contigus +// et en variables globales: bis si c'est un aiguillage bis +// s'ils ne sont pas contigus, on aura une erreur +// alg= algorithme : +// 1=arret sur suivant qu'il soit un détecteur ou un aiguillage +// 2=arret sur aiguillage en talon mal positionné +// 3=arret sur un aiguillage pris en pointe dévié et AdrDevie contient l'adresse de l'aiguillage dévié ainsi que Bis +// code de sortie : élément suivant ou: +// 9999=erreur fatale +// 9998= arret sur aiguillage en talon mal positionnée +// 9997: arrêt sur aiguillage dévié +function suivant_alg3(prec : integer;BisPrec : boolean;actuel : integer;BisActuel : boolean;alg : integer) : integer; +var Btype,Adr,AdrPrec,BtypePrec,indexBranche_prec,branche_trouve_prec,indexBranche_actuel,branche_trouve_actuel, + tjsc1,tjsc2,AdrTjdP,Adr2 : integer; + Abis,tjscourbe1,tjscourbe2,tjd,tjs : boolean; + A,Aprec,tjsc1B,tjsc2B: char; +label recommence; +begin + recommence: + if NivDebug=3 then AfficheDebug('Alg3 précedent='+intToSTR(prec)+' actuel='+intToSTR(actuel),clyellow); + // trouver les éléments du précédent + trouve_element(prec,BisPrec); // branche_trouve IndexBranche_trouve + if IndexBranche_trouve=0 then + begin + if NivDebug=3 then AfficheDebug('Element '+intToSTR(prec)+' non trouvé',clred); + suivant_alg3:=9999;exit; + end; + + indexBranche_prec:=IndexBranche_trouve; + branche_trouve_prec:=branche_trouve; + BtypePrec:=BrancheN[branche_trouve_prec,indexBranche_prec].Btype; + // if BTypePrec=2 then aiguillage[prec].A + + trouve_element(actuel,BisActuel); // branche_trouve IndexBranche_trouve + if IndexBranche_trouve=0 then + begin + if NivDebug=3 then AfficheDebug('Element '+intToSTR(actuel)+' non trouvé',clred); + suivant_alg3:=9999;exit; + end; + + indexBranche_actuel:=IndexBranche_trouve; + branche_trouve_actuel:=branche_trouve; + + Adr:=actuel; + Btype:=BrancheN[branche_trouve_actuel,indexBranche_actuel].Btype; + + if Btype=1 then // l'élément actuel est un détecteur + begin + // on part de l'actuel pour retomber sur le précédent + if BrancheN[branche_trouve_actuel,indexBranche_actuel-1].Adresse=prec then // c'est l'autre sens + begin + if NivDebug=3 then AfficheDebug('40 - trouvé détecteur '+intToSTR(adr)+' en + ',clwhite); + Prec:=Adr; + Aprec:=a; + A:='Z'; + Adr:=BrancheN[branche_trouve_actuel,indexBranche_actuel+1].Adresse; + Btype:=BrancheN[branche_trouve_actuel,indexBranche_actuel+1].Btype; + Bis:=Btype=3; + if NivDebug=3 then AfficheDebug('41 - Le suivant est :'+intToSTR(adr)+'('+intToSTR(Btype)+')',clwhite); + suivant_alg3:=adr; + exit; + end; + if BrancheN[branche_trouve_actuel,indexBranche_actuel+1].Adresse=prec then + begin + if NivDebug=3 then AfficheDebug('42 - trouvé détecteur '+intToSTR(adr)+' en - ',clwhite); + Prec:=Adr; + Aprec:=a; + A:='Z'; + Adr:=BrancheN[branche_trouve_actuel,indexBranche_actuel-1].Adresse; + Btype:=BrancheN[branche_trouve_actuel,indexBranche_actuel-1].Btype; + Bis:=Btype=3; + if NivDebug=3 then AfficheDebug('43 - Le suivant est :'+intToSTR(adr)+'('+intToSTR(Btype)+')',clwhite); + suivant_alg3:=adr; + exit; + end; + // ici, les éléments sont non consécutifs. voir si l'un des deux est une TJD/TJS + if (btypePrec=2) or (btypePrec=3) then + begin + if NivDebug=3 then AfficheDebug('Le précedent est une TJD/S - substitution du precédent par la pointe de la TJD',clYellow); + // changer l'adresse du précédent par l'autre adresse de la TJD/S + prec:=Aiguillage[prec].APointe; + goto recommence; + end; + + Affiche('44 - éléments non consécutifs: Prec='+intToSTR(prec)+' Actuel='+intTostr(Actuel),clred); + if NivDebug=3 then AfficheDebug('44 - éléments non consécutifs: Prec='+intToSTR(prec)+' Actuel='+intTostr(Actuel),clred); + end; + + if (Btype>=2) then // aiguillage ou bis ou buttoir + begin + if ((aiguillage[Adr].modele=1) and (Btype=2) and not(BisActuel)) then // aiguillage normal non bis + begin + // aiguillage pris en pointe + if (aiguillage[adr].Apointe=prec) then + begin + if aiguillage[Adr].position=const_droit then + begin + if NivDebug=3 then AfficheDebug('130 - aiguillage '+intToSTR(Adr)+' Pris en pointe droit',clyellow); + AdrPrec:=Adr; + if Adr=0 then + begin + Affiche('131 - Erreur fatale',clRed);suivant_alg3:=9999;exit; + end; + BtypePrec:=Btype; + Aprec:=a; + ABis:=aiguillage[Adr].AdroitBis=1; + A:=aiguillage[Adr].AdroitB; + Adr:=aiguillage[Adr].Adroit; + trouve_element(adr,Abis); // branche_trouve IndexBranche_trouve + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].Btype; + Bis:=Abis; + suivant_alg3:=adr;exit; + end; + if aiguillage[Adr].position<>const_droit then + begin + if NivDebug=3 then AfficheDebug('133 - aiguillage '+intToSTR(Adr)+' Pris en pointe dévié',clyellow); + AdrPrec:=Adr; + if alg=3 then // on demande d'arreter si l'aiguillage pris en pointe est dévié + begin + bis:=false; + AdrDevie:=Adr; + suivant_alg3:=9997;exit; + end; + if Adr=0 then + begin Affiche('134 - Erreur fatale',clRed); + if NivDebug>=1 then AfficheDebug('134 - Erreur fatale',clRed); + suivant_alg3:=9999;exit; + end; + BtypePrec:=Btype; + Aprec:=A; + A:=aiguillage[Adr].AdevieB; + ABis:=aiguillage[Adr].AdevieBis=1; + Adr:=aiguillage[Adr].Adevie; + trouve_element(adr,Abis); // branche_trouve IndexBranche_trouve + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].Btype; + Bis:=Abis; + suivant_alg3:=adr;exit; + end; + end + else + begin + if NivDebug=3 then AfficheDebug('135 - aiguillage '+intToSTR(Adr)+' Pris en talon',clyellow); + if alg=2 then // on demande d'arreter si l'aiguillage en talon est mal positionné + begin + if aiguillage[adr].position=const_droit then + begin + if prec<>aiguillage[Adr].Adroit then + begin + if NivDebug=3 then AfficheDebug('135.1 - Aiguillage '+intToSTR(adr)+' mal positionné',clyellow); + suivant_alg3:=9998;exit; + end + else + begin + if NivDebug=3 then AfficheDebug('135.2 - Aiguillage '+intToSTR(adr)+' bien positionné',clyellow); + end; + end + else + begin + if prec<>aiguillage[Adr].Adevie then + begin + if NivDebug=3 then AfficheDebug('Aiguillage '+intToSTR(adr)+' mal positionné',clyellow); + suivant_alg3:=9998;exit; + end + else + begin + if NivDebug=3 then AfficheDebug('Aiguillage '+intToSTR(adr)+' bien positionné',clyellow); + end; + end; + end; + + AdrPrec:=Adr; + if Adr=0 then + begin Affiche('136 - Erreur fatale',clRed); + if NivDebug>=1 then AfficheDebug('136 - Erreur fatale',clRed); + suivant_alg3:=9999;exit; + end; + BtypePrec:=Btype; + APrec:=A; + // Affiche('trouvé'+intToSTR(adr),clyellow); + A:=aiguillage[Adr].ApointeB; + ABis:=aiguillage[Adr].ApointeBis=1; + Adr:=aiguillage[Adr].Apointe; + trouve_element(adr,Abis); // branche_trouve IndexBranche_trouve + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].Btype; + Bis:=Abis; + suivant_alg3:=adr;exit; + end; + Affiche('138 - Erreur fatale - Aucun cas Aiguillage',clred); + if NivDebug=3 then AfficheDebug('138 - Erreur fatale - Aucun cas Aiguillage',clred); + suivant_alg3:=9999;exit; + end; + + if ((aiguillage[Adr].modele=1) and (Btype=3) and (BisActuel)) then // aiguillage normal bis + begin + // aiguillage pris en pointe + if (aiguillageB[Adr].Apointe=Prec) then + begin + if (aiguillageB[Adr].position=const_droit) then + begin + if NivDebug=3 then AfficheDebug('140 - Aiguillage '+intToSTR(adr)+' bis pris en pointe droit',clyellow); + AdrPrec:=Adr; + if alg=3 then // on demande d'arreter si l'aiguillage pris en pointe est dévié + begin + bis:=true; + AdrDevie:=Adr; + suivant_alg3:=9997;exit; + end; + if (Adr=0) then begin Affiche('141 - Erreur fatale',clred);suivant_alg3:=9999;exit;end; + BtypePrec:=Btype; + APrec:=A; + A:=aiguillageB[Adr].AdroitB; + ABis:=aiguillageB[Adr].AdroitBis=1; + Adr:=aiguillageB[Adr].Adroit; + trouve_element(Adr,ABis); // branche_trouve IndexBranche_trouve + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + Bis:=ABis; + suivant_alg3:=Adr; exit; + end; + if (aiguillage[Adr].position<>const_droit) then + begin + AdrPrec:=Adr; + if (Adr=0) then begin Affiche('144 - Erreur fatale',clred);suivant_alg3:=9999;exit;end; + BtypePrec:=Btype; + APrec:=A; + A:=aiguillageB[Adr].AdevieB; + ABis:=aiguillageB[Adr].AdevieBis=1; + Adr:=aiguillageB[Adr].Adevie; + trouve_element(Adr,ABis); // branche_trouve IndexBranche_trouve + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + Bis:=ABis; + suivant_alg3:=Adr;exit; + end; + end + else + begin + if (NivDebug=3) then AfficheDebug('145 - Aiguillage '+IntToSTR(adr)+' bis pris en talon',clyellow); + AdrPrec:=Adr; + if (Adr=0) then begin AfficheDebug('146 - Erreur fatale',clred);suivant_alg3:=9999;exit;end; + BtypePrec:=Btype; + APrec:=A; + ABis:=aiguillageB[Adr].ApointeBis=1; + // Affiche('trouvé'+intToSTR(adr),clyellow); + A:=aiguillage[Adr].ApointeB; + Adr:=aiguillageB[Adr].Apointe; // bug + trouve_element(Adr,ABis); // branche_trouve IndexBranche_trouve + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + Bis:=ABis; + suivant_alg3:=Adr;exit; + end; + end; + + + if (aiguillage[Adr].modele=2) or (aiguillage[Adr].modele=3) then // TJD ou TJS + begin + AdrTjdP:=aiguillage[Adr].Apointe; + tjd:=aiguillage[Adr].modele=2; + tjs:=aiguillage[Adr].modele=3; + tjsc1:=aiguillage[Adr].tjsint; // adresses de la courbe de la TJD + tjsc2:=aiguillage[AdrTjdP].tjsint; + tjsc1B:=aiguillage[Adr].tjsintB; + tjsc2B:=aiguillage[AdrTjdP].tjsintB; + if tjsc1<>0 then + begin + tjscourbe1:=(aiguillage[Adr].tjsintB='S') and (aiguillage[tjsc1].position<>const_droit); + tjscourbe1:=((aiguillage[Adr].tjsintB='D') and (aiguillage[tjsc1].position=const_droit)) or tjscourbe1; + end; + if tjsc2<>0 then + begin + tjscourbe2:=(aiguillage[AdrTjdP].tjsintB='S') and (aiguillage[tjsc2].position<>const_droit); + tjscourbe2:=((aiguillage[AdrTjdP].tjsintB='D') and (aiguillage[tjsc2].position=const_droit)) or tjscourbe2; + end; + if NivDebug=3 then AfficheDebug('137 - TJD '+intToSTR(Adr)+'/'+IntToSTR(AdrTjdP),clYellow); + AdrTjdP:=aiguillage[Adr].Apointe; // adresse TJD homologue + // determiner la position de la première section de la TJD (4 cas) + // cas 1 : droit droit + if (( aiguillage[Adr].position=const_droit) and + (aiguillage[AdrTjdP].position=const_droit) and tjd) then + begin + if NivDebug=3 then AfficheDebug('cas1 tjd',clYellow); + if aiguillage[AdrTjdP].Adroit=prec then + begin + A:=aiguillage[Adr].AdroitB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[Adr].Adroit; + BisPrec:=aiguillage[Adr].AdroitBis=1; + suivant_alg3:=adr;exit; + end; + if aiguillage[Adr].Adroit=prec then + begin + A:=aiguillage[AdrTjdP].AdroitB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[AdrTjdP].Adroit; + BisPrec:=aiguillage[AdrTjdP].AdroitBis=1; + suivant_alg3:=adr;exit; + end; + //Affiche('Erreur 1021 adrTJD='+IntToSTR(Adr)+' adrTJDPointe='+intToSTR(AdrTJDP)+' prec='+IntTOSTR(prec),clred); + Suivant_alg3:=9999;exit; + end; + // cas 2 TJD + if (aiguillage[Adr].position<>const_droit) + and (aiguillage[AdrTjdP].position=const_droit) and tjd then + begin + if NivDebug=3 then AfficheDebug('cas2 tjd',clYellow); + if aiguillage[AdrTjdP].Adroit=prec then + begin + A:=aiguillage[Adr].AdevieB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[Adr].Adevie; + BisPrec:=aiguillage[Adr].AdevieBis=1; + suivant_alg3:=adr;exit; + end; + if aiguillage[Adr].Adevie=prec then + begin + A:=aiguillage[AdrTjdP].AdroitB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[AdrTjdP].Adroit; + BisPrec:=aiguillage[AdrTjdP].AdroitBis=1; + suivant_alg3:=adr;exit; + end; + //Affiche('Erreur 1022',clred); + Suivant_alg3:=9999;exit; + end; + // cas 3 TJD + if (aiguillage[Adr].position=const_droit) + and (aiguillage[AdrTjdP].position<>const_droit) and tjd then + begin + if NivDebug=3 then AfficheDebug('cas3 tjd',clYellow); + if (aiguillage[AdrtjdP].Adevie=prec) then + begin + A:=aiguillage[AdrTjdP].AdroitB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[Adr].Adroit; + BisPrec:=aiguillage[Adr].AdroitBis=1; + suivant_alg3:=adr;exit; + end; + if (aiguillage[Adr].Adroit=prec) then + begin + A:=aiguillage[Adr].AdevieB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[Adr].Adevie; + BisPrec:=aiguillage[Adr].AdevieBis=1; + suivant_alg3:=adr;exit; + end; + //Affiche('Erreur 1023',clred); + Suivant_alg3:=9999;exit; + end; + // cas 4 tjd + if (aiguillage[Adr].position<>const_droit) + and (aiguillage[AdrTjdP].position<>const_droit) then + begin + if NivDebug=3 then AfficheDebug('cas4 tjd',clYellow); + if aiguillage[AdrTjdP].Adevie=prec then + begin + A:=aiguillage[Adr].AdevieB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[Adr].Adevie; + BisPrec:=aiguillage[Adr].AdevieBis=1; + suivant_alg3:=adr;exit; + end; + if aiguillage[Adr].Adevie=prec then + begin + A:=aiguillage[AdrtjdP].AdevieB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[AdrtjdP].Adevie; + BisPrec:=aiguillage[AdrtjdP].AdevieBis=1; + suivant_alg3:=adr;exit; + end; + //Affiche('Erreur 1024',clred); + Suivant_alg3:=9999;exit; + end; + // cas TJS prise dans sa position courbe + if ((aiguillage[Adr].Adevie=Prec) and (aiguillage[Adr].AdevieB=Aprec) and (aiguillage[Adr].position<>const_droit) + and (aiguillage[AdrTjdP].position=const_droit) and (tjs) and tjscourbe1 and tjscourbe2) then + begin + if NivDebug=3 then AfficheDebug('cas tjs en courbe1',clYellow); + A:=aiguillage[AdrTjdP].AdevieB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[AdrTjdP].Adevie; + BisPrec:=aiguillage[AdrTjdP].AdroitBis=1; + suivant_alg3:=adr;exit; + end; + // cas 3 TJS prise dans sa 2eme position courbe + if ((aiguillage[Adr].Adroit=Prec) and (aiguillage[Adr].AdroitB=Aprec) and (aiguillage[Adr].position=const_droit) + and (aiguillage[AdrTjdP].position<>const_droit) and (tjs) and tjscourbe1 and tjscourbe2 ) then + begin + if NivDebug=3 then AfficheDebug('cas1 tjs en courbe 2',clYellow); + A:=aiguillage[AdrTjdP].AdevieB; + if A='Z' then Btype:=1 else Btype:=2; + Adr:=aiguillage[AdrTjdP].Adevie; + BisPrec:=aiguillage[AdrTjdP].AdroitBis=1; + suivant_alg3:=adr;exit; + end; + Affiche('139 - Erreur fatale - Aucun cas TJD/S : adr='+IntToSTR(Adr)+' '+intToSTR(AdrTJDP)+' prec='+IntTOSTR(prec),clred); + AfficheDebug('139 - Erreur fatale - Aucun cas TJD/S : adr='+IntToSTR(Adr)+' '+intToSTR(AdrTJDP)+' prec='+IntTOSTR(prec),clred); + suivant_alg3:=9999;exit; + end; + if (aiguillage[Adr].modele=4) then // aiguillage triple + begin + // aiguillage triple pris en pointe + Adr2:=aiguillage[Adr].AdrTriple; + // attention la lecture d'un aiguillage triple est différente suivant la connexion avec CDM + // ou avec l'interface + if ( CDM_connecte and (aiguillage[Adr].position=const_droit) ) or + ( not(CDM_connecte) and (aiguillage[Adr].position=const_droit) and (aiguillage[Adr2].position=const_droit) ) then + begin + if NivDebug=3 then AfficheDebug('Aiguillage triple droit',clYellow); + BisPrec:=aiguillage[Adr].AdroitBis=1; + //TSuiv=aiguillage[Adr].AdroitB; + Adr:=aiguillage[Adr].Adroit; + end; + if ( CDM_connecte and (aiguillage[Adr].position=const_devieG) ) or + ( not(CDM_connecte) and (aiguillage[Adr].position<>const_droit) and (aiguillage[Adr2].position=const_droit) ) then + begin + if NivDebug=3 then AfficheDebug('Aiguillage triple dévié1 (gauche)',clYellow); + BisPrec:=aiguillage[Adr].AdevieBis=1; + //TSuiv=aiguillage[Adr].AdevieB; + Adr:=aiguillage[Adr].Adevie; + end; + if ( CDM_connecte and (aiguillage[Adr].position=const_devieG) ) or + ( not(CDM_connecte) and (aiguillage[Adr].position=const_droit) and (aiguillage[Adr2].position<>const_droit) ) then + begin + if NivDebug=3 then AfficheDebug('Aiguillage triple dévié2 (droit)',clYellow); + BisPrec:=aiguillage[Adr].Adevie2Bis=1; + //TSuiv=aiguillage[Adr].Adevie2B; + Adr:=aiguillage[Adr].Adevie2; + end; + if ((aiguillage[Adr].position<>const_droit) and (aiguillage[Adr2].position<>const_droit) ) then + begin + AfficheDebug('Aiguillage triple '+IntToSTR(Adr)+' : configuration des aiguilles interdite',clYellow); + Affiche('Aiguillage triple : '+IntToSTR(Adr)+' configuration des aiguilles interdite',clRed); + //TSuiv='Z'; + suivant_alg3:=9999;exit; // pour échappement + end; + end; + end; + suivant_alg3:=adr; +end; + +// trouve l'index du feu associé au détecteur adr +function index_feu_det(adr : integer) : integer ; + var i : integer; + trouve,trouve1,trouve2,trouve3,trouve4 : boolean; +begin +i:=1; + repeat + trouve1:=feux[i].Adr_det1=adr; + trouve2:=feux[i].Adr_det2=adr; + trouve3:=feux[i].Adr_det3=adr; + trouve4:=feux[i].Adr_det4=adr; + trouve:=trouve1 or trouve2 or trouve3 or trouve4; + if not(trouve) then inc(i); + until (trouve) or (i>=100); + if trouve then Index_feu_det:=i else Index_feu_det:=0; +end; + + +// renvoie l'adresse du détecteur suivant des deux éléments contigus +function detecteur_suivant(prec : integer;BisPrec : boolean;actuel : integer;BisActuel : boolean) : integer ; +var AdrDet,actuelCalc,PrecCalc,etat,i,j,AdrSuiv : integer; + BisprecCalc,BisActuelCalc : boolean; +begin + if NivDebug>=2 then AfficheDebug('cherche détecteur suivant aux '+IntToSTR(prec)+'-'+intToSTR(actuel),clyellow); + j:=0; + + PrecCalc:=prec; + bisprecCalc:=bisprec; + ActuelCalc:=actuel; + BisActuelCalc:=BisActuel; + // étape 1 trouver le sens + repeat + inc(j); + AdrSuiv:=suivant_alg3(precCalc,BisPrecCalc,actuelCalc,BisActuelCalc,1); + precCalc:=actuelCalc; + BisPrecCalc:=BisActuelCalc; + actuelCalc:=AdrSuiv; + BisActuelCalc:=Bis; + //Affiche('Suivant signalaig='+IntToSTR(AdrSuiv),clyellow); + until (j=10) or (AdrSuiv>512) or (AdrSuiv=0); // + // si trouvé le sens, trouver le suivant + if AdrSuiv=actuel then + begin + AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,1); + end; + if NivDebug=3 then AfficheDebug('Le suivant est le '+intToSTR(AdrSuiv),clYellow); + detecteur_suivant:=AdrSuiv; +end; + +// renvoie l'adresse du détecteur suivant des deux éléments +// Det1 et Det2 peuvent être séparés par des aiguillages +function detecteur_suivant_El(el1: integer;BisDet1 : boolean;el2 : integer;BisDet2 : boolean) : integer ; +var IndexBranche_det1,IndexBranche_det2,branche_trouve_det1,branche_trouve_det2,i, + j,AdrPrec,Adr,AdrFonc,Btype : integer; + BisPrec,BisFonc,BisSuiv,Sortie : boolean; + s : string; + +begin + if NivDebug>=2 then AfficheDebug('cherche détecteur_suivant_El aux '+IntToSTR(el1)+'-'+intToSTR(el2),clyellow); + // traceDet=TRUE; + // trouver détecteur 1 + trouve_detecteur(el1); // branche_trouve IndexBranche_trouve + if (IndexBranche_trouve=0) then + begin + Affiche('élément '+IntToSTR(el1)+' non trouvé',clred); + detecteur_suivant_El:=1;exit; + end; + IndexBranche_det1:=IndexBranche_trouve; + branche_trouve_det1:=branche_trouve; + + // trouver détecteur 2 + trouve_detecteur(el2); // branche_trouve IndexBranche_trouve + if (IndexBranche_trouve=0) then + begin + Affiche('élément '+IntToSTR(el2)+' non trouvé',clred); + detecteur_suivant_El:=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 (NivDebug=4) then + begin + s:='Test route en '; + if (j=1) then s:=s+'décrément ' else s:=s+'incrément '; + s:=s+'- départ depuis détecteur '+IntToSTR(el1);Affiche(s,clyellow); + end; + AdrPrec:=el1; + BisPrec:=FALSE; + Bis:=FALSE; + 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,i].BType; // élément suivant/précédent + BisFonc:=Btype=3; // bug si aiguillage bis + i:=0; + if (el2<>Adr) then + 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 + trouve_element(Adr,Bis); + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + BisSuiv:=Btype=3; // si aiguillage bis + //Affiche(intToSTR(adr)+'/'+intToStr(Btype),clorange); + AdrPrec:=AdrFonc;AdrFonc:=Adr; + BisPrec:=BisFonc;BisFonc:=Bis; + i:=i+1; + sortie:=(Adr=El2) or (i=20) or (Adr=0) or ((Adr<>el2) and (btype=1)); + until (sortie) ; // boucle de parcours + if (i=20) then + begin Affiche('Erreur fatale 300 : Itération trop longue',clred); + AfficheDebug('Erreur fatale 300 : Itération trop longue',clred); + detecteur_suivant_el:=3;end; + if ((Btype=1) and (Adr<>el2) and (NivDebug=3)) then AfficheDebug('N''est pas le détecteur attendu '+intToSTR(Adr)+' pour '+intToSTR(el2),clyellow); + inc(j); // changement de sens + sortie:=(Adr=el2) or (j=3) or (Adr=0); + until sortie; + + // si arret sur buttoir + if Adr=0 then begin detecteur_suivant_el:=0;exit;end; + + if ((j=3) and (Adr<>el2)) then + begin + if NivDebug=3 then AfficheDebug('Pas de suivant sur séquence '+IntToSTR(el1)+' à '+intToStr(el2),clyellow); + detecteur_suivant_el:=0;exit; + end; + + // étape 2 : on a trouvé le sens de progression, trouver le détecteur suivant + if (Adr=el2) then + begin + // trouvé la route si j=2 : - si j=3 : + + if (NivDebug=3) then AfficheDebug('Route trouvée',clyellow); + i:=0; + AdrFonc:=Adr; + BisFonc:=FALSE; + BisSuiv:=FALSE; + Bis:=FALSE; + repeat + Adr:=suivant_alg3(AdrPrec,BisPrec,AdrFonc,BisFonc,1); + // if i=0 then El_suivant:=Adr; //??????? + trouve_element(Adr,Bis); + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + BisSuiv:=Btype=3; // si aiguillage bis + if (NivDebug=3) then AfficheDebug('Suivant='+IntToSTR(Adr)+ '('+intToSTR(Btype)+')',clyellow); + AdrPrec:=AdrFonc;AdrFonc:=Adr; + BisPrec:=BisFonc;BisFonc:=Bis; + inc(i); + sortie:=(Btype=1) or (Adr=0) or (i=20); + until sortie; + if NivDebug>=2 Then AfficheDebug('Détecteur suivant='+intToSTR(Adr),clOrange); + if (bType=1) or (Adr=0) then detecteur_suivant_el:=Adr; + if (i=20) then begin + if NivDebug=3 then AfficheDebug('Erreur fatale 201 : Itération trop longue',clred); + Affiche('Erreur fatale 201 : Itération trop longue',clred);detecteur_suivant_el:=3;end; + end; +end; + + + +// renvoi vrai si les aiguillages au delà du signal sont mal positionnés +function carre_signal(adresse : integer) : boolean; +var + i,j,prec,AdrFeu,AdrSuiv,actuel : integer; + multi, sort, BisPrec,BisActuel : boolean; + s : string; +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 (feux[i].VerrouCarre=FALSE) // si le feu n'est pas verrouillable au carré +// { +// if (traceDet) {sprintf(s,"Ce signal %d n'est pas verrouillable au carré\r\n",adresse); +// Display(s); +// if (echoLog) fputs(s,fichier);} +// return FALSE; +// } + j:=0; + prec:=feux[i].Adr_det1; + BisPrec:=FALSE; + actuel:=feux[i].Adr_el_suiv1; + BisActuel:=feux[i].Btype_suiv1=5; + multi:=feux[i].Adr_det2<>0; + // trouver si une des voies présente un train + if (multi) then + begin + carre_signal:=FALSE; // pour l'instant verrouillé + exit; + end; + + //Affiche(IntToSTR(actuel),clyellow); + repeat + inc(j); + AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,2); + if (AdrSuiv<>9998) then // arret sur aiguillage en talon mal positionnée + begin + prec:=actuel; + BisPrec:=BisActuel; + actuel:=AdrSuiv; + BisActuel:=Bis; + end; + // si le suivant est un détecteur comporte t-il un signal? + AdrFeu:=0; + if (AdrSuiv>500) then + begin + AdrFeu:=index_feu_det(AdrSuiv); + //Affiche(IntToSTR(AdrFeu),clOrange); + end; + sort:=(j=10) or (AdrFeu<>0) or (AdrSuiv=9998) or (AdrSuiv=0); // arret si aiguillage en talon ou buttoir + until (sort); + // si trouvé un feu ou j=10, les aiguillages sont bien positionnés + // si trouvé 9998, aiguillages mal positionnés + if (NivDebug=3) then + begin + if (AdrSuiv=9998) then AfficheDebug('Le signal '+intToSTR(adresse)+' doit afficher un carré car l''aiguillage pris en talon '+IntToSTR(actuel)+' est mal positionné',clYellow) + else AfficheDebug('Le signal '+IntToSTR(adresse)+' ne doit pas être au carré',clYellow); + end; + carre_signal:=AdrSuiv=9998; +end; + + +// renvoie l'état du signal suivant +// si renvoie 0, pas trouvé le signal suivant. +// rang=1 pour feu suivant, 2 pour feu suivant le 1, etc +function etat_signal_suivant(adresse,rang : integer) : integer ; +var num_feu,AdrDet,etat,AdrFeu,i,j,prec,AdrSuiv : integer; + BisPrec,BisActuel : boolean; +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 + Affiche('Erreur 600 - feu non trouvé',clred); + etat_signal_suivant:=0; + exit; + end; + Etat:=0; + j:=0; + num_feu:=0; + prec:=Feux[i].Adr_det1; // détecteur sur le courant + if prec=0 then + begin + Affiche('Msg 601 - feu '+intToSTR(adresse)+' non renseigné ',clOrange); + etat_signal_suivant:=0; + exit; + end; + BisPrec:=false; + actuel:=feux[i].Adr_el_suiv1; + BisActuel:=feux[i].btype_suiv1=5; + + // si actuel est un détecteur, regarder si il ya un feu + repeat + inc(j); + // à la première itération, si "actuel" est déja un détecteur, ne pas faire de recherche sur le suivant + if (j=1) and (actuel>512) then + begin + AdrSuiv:=actuel; + actuel:=prec; + BisPrec:=FALSE; + BisActuel:=FALSE; + end + else + AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,1); + + if (AdrSuiv=9999) then + begin + Etat_signal_suivant:=0; + exit; + end; + if (AdrSuiv=0) then + begin + if NivDebug=3 then AfficheDebug('Le suivant est un buttoir',clyellow); + Etat_signal_suivant:=carre_F; // faire comme si c'était un signal au carré + exit; + end; + + prec:=actuel; + BisPrec:=BisActuel; + actuel:=AdrSuiv; + BisActuel:=Bis; + // si le suivant est un détecteur comporte t-il un signal? + + AdrFeu:=0; + if (AdrSuiv>512) then + begin + i:=Index_feu_det(AdrSuiv); + AdrFeu:=Feux[i].Adresse; + //affiche(intToSTR(Feux[i].Adr_el_suiv)+'/'+intTostr(prec),clyellow); + 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 + 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 + // oui + inc(num_feu); + Etat:=EtatSignalCplx[AdrFeu]; + Signal_suivant:=AdrFeu; + if NivDebug=3 then AfficheDebug('Trouvé feu suivant Adr='+IntToSTR(AdrFeu)+'='+IntToSTR(etat),clOrange); + end + else + begin + if NivDebug=3 then AfficheDebug('Trouvé feu '+intToSTR(AdrFeu)+' mais dans le mauvais sens',clOrange); + AdrFeu:=0; + end; + end; + end; + until (j=10) or ((AdrFeu<>0) and (num_feu=rang)); + if etat=0 then Signal_Suivant:=0; + etat_signal_suivant:=Etat; + if NivDebug=3 then AfficheDebug('Pas Trouvé de feu suivant au feu Adr='+IntToSTR(ADresse),clOrange); + //TraceDet:=false; +end; + + +// renvoie l'adresse de l'aiguille si elle est déviée après le signal et ce jusqu'au prochain signal +// sinon renvoie 0 +// adresse=adresse du signal +function Aiguille_deviee(adresse : integer) : integer ; +var AdrDet,AdrFeu,etat,i,j,prec,AdrSuiv,Actuel : integer; + BisPrec,BisActuel : boolean; + s : string; +begin + //traceDet:=true; + if NivDebug>=2 then AfficheDebug('test si aiguille déviée après signal '+IntToSTR(Adresse),clyellow); + j:=0; + i:=Index_feu(adresse); + prec:=feux[i].Adr_det1; + BisPrec:=false; + actuel:=feux[i].Adr_el_suiv1; + BisActuel:=feux[i].btype_suiv1=3; + //Affiche(IntToSTR(actuel),clyellow); + AdrFeu:=0; + AdrDevie:=0; + if (actuel<512) then + begin + if (aiguillage[actuel].Apointe=prec) and (aiguillage[actuel].position<>const_droit) then Aiguille_deviee:=actuel; + end; + + repeat + inc(j); + // 3=demande si le suivant est un aiguillage en pointe dévié oui si AdrSuiv=9997 + // dans ce cas la variable globale AdrDevie est mise à jour + AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,3); + if NivDebug=3 then AfficheDebug('701 - Suivant signalaig='+IntToSTR(AdrSuiv),clyellow); + if ADrSuiv<>9997 then + begin + prec:=actuel; + BisPrec:=BisActuel; + actuel:=AdrSuiv; + BisActuel:=Bis; + // si le suivant est un détecteur comporte t-il un signal? + AdrFeu:=0; + if (AdrSuiv>512) then + begin + i:=Index_feu_det(AdrSuiv); + AdrFeu:=Feux[i].Adresse; + if NivDebug=3 then AfficheDebug('trouvé signal '+intToSTR(AdrFeu)+' associé au détecteur '+IntToSTR(AdrSuiv),clyellow); + end; + end; + until (j=10) or (AdrSuiv=9997) or (AdrFeu<>0) ; + if (AdrSuiv=9997) then + begin + s:='le signal '+intToSTR(adresse)+' doit afficher un rappel car l''aiguillage '+intToSTR(AdrDevie); + if bis then s:=s+'bis'; + s:=s+' est dévié'; + if NivDebug=3 then AfficheDebug(s,clYellow); + end; + if ((AdrSuiv<>9997) or (j=10)) and (NivDebug=3) then + begin + S:='le signal '+intToSTR(adresse)+' ne doit pas afficher de rappel car '; + if j<>10 then s:=s+'trouvé un autre signal suivant et pas d''aiguillage dévié' + else s:=s+' signal trop éloigné'; + AfficheDebug(s,clYellow); + end; + Aiguille_deviee:=AdrDevie; +end; + +// renvoie vrai si une mémoire de zone est occupée du signal courant au signal suivant +// a compléter par les 4 détecteurs.... +function test_memoire_zones(adresse : integer) : boolean; +var + ife,Detecteur_precedent,actuel,AdrDet,Etat,AdrFeu,i,j,prec,AdrSuiv : integer; + Pres_train,sort,BisPrec,BisActuel : boolean; +begin + if NivDebug>=1 then AfficheDebug('Cherche mémoire à 1 du signal '+intToSTR(adresse)+' au signal suivant ',clyellow); + + i:=Index_feu(adresse); + if (i=0) then + begin + Affiche('Erreur 650 - feu non trouvé',clred); + AfficheDebug('Erreur 650 - feu non trouvé',clred); + test_memoire_zones:=false; + end; + + + 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',clred); + if (ife=1) then begin prec:=feux[i].Adr_det1;actuel:=feux[i].Adr_el_suiv1;BisActuel:=feux[i].Btype_suiv1=5;end; //détecteur sur le signal courant + if (ife=2) then begin prec:=feux[i].Adr_det2;actuel:=feux[i].Adr_el_suiv2;BisActuel:=feux[i].Btype_suiv2=5;end; // détecteur sur le signal courant + if (ife=3) then begin prec:=feux[i].Adr_det3;actuel:=feux[i].Adr_el_suiv3;BisActuel:=feux[i].Btype_suiv3=5;end; // détecteur sur le signal courant + if (ife=4) then begin prec:=feux[i].Adr_det4;actuel:=feux[i].Adr_el_suiv4;BisActuel:=feux[i].Btype_suiv4=5;end; // détecteur sur le signal courant + + Detecteur_precedent:=prec; + if (prec=0) then + begin + test_memoire_zones:=Pres_train; + exit; + end; + BisPrec:=FALSE; + + 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 (actuel>512) then + begin + AdrSuiv:=actuel; + actuel:=prec; + BisPrec:=FALSE; + BisActuel:=FALSE; + Pres_train:=MemZone[prec,actuel]; + if Pres_Train and (NivDebug=3) then Affiche('Présence train de '+intToSTR(prec)+' à '+intToSTR(actuel),clyellow); + Detecteur_precedent:=actuel; + end + else + AdrSuiv:=suivant_alg3(prec,BisPrec,actuel,BisActuel,1); + + prec:=actuel; + BisPrec:=BisActuel; + actuel:=AdrSuiv; + BisActuel:=Bis; + + if AdrSuiv=0 then + begin + // si c'est un buttoir + test_memoire_zones:=false; + exit; + end; + // si le suivant est un détecteur comporte t-il un signal? + AdrFeu:=0; + if (AdrSuiv>512) then + begin + if (NivDebug=3) and MemZone[Detecteur_precedent][actuel] then AfficheDebug('Présence train de '+intToSTR(Detecteur_precedent)+' à '+intToSTR(actuel),clyellow); + + Pres_train:=MemZone[Detecteur_precedent][actuel] or Pres_train; // mémoire de zone + Detecteur_precedent:=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 + begin + AdrFeu:=0;j:=10; // on ne trouve pas de suivant + 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 + 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); + test_memoire_zones:=Pres_train;exit; + end + else + begin + if NivDebug=3 then AfficheDebug('Trouvé feu '+intToSTR(AdrFeu)+' mais dans le mauvais sens',clOrange); + AdrFeu:=0; + 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) ; + until (sort); + 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; + + + +// calcul des zones depuis le tableau des fronts descendants des évènements détecteurs +// 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 : integer; + BisPrec,BisSuiv,BisFonc,sortie : boolean; + s : string; + +begin + // traceDet=TRUE; + // trouver détecteur 1 + trouve_detecteur(det1); // branche_trouve IndexBranche_trouve + if (IndexBranche_trouve=0) then + begin + Affiche('détecteur '+IntToSTR(det1)+' non trouvé',clred); + calcul_zones_det:=1;exit; + 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 (NivDebug=3) then + begin + s:='Test 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);Affiche(s,clyellow); + end; + AdrPrec:=det1; + BisPrec:=FALSE; + Bis:=FALSE; + 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,i].BType; // élément suivant/précédent + BisFonc:=Btype=3; // bug si aiguillage bis + i:=0; + if (det2<>Adr) then + 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 + trouve_element(Adr,Bis); + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + BisSuiv:=Btype=3; // si aiguillage bis + //Affiche(intToSTR(adr)+'/'+intToStr(Btype),clorange); + AdrPrec:=AdrFonc;AdrFonc:=Adr; + BisPrec:=BisFonc;BisFonc:=Bis; + i:=i+1; + sortie:=(Btype=1) or (Btype=4) or (i=20) or (Adr=0); + until (sortie) ; // boucle de parcours + + 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 (NivDebug=3) ) 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 (NivDebug=3) 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 (NivDebug=3) then AfficheDebug('Route trouvée',clyellow); + i:=0; + AdrFonc:=Adr; + BisFonc:=FALSE; + BisSuiv:=FALSE; + Bis:=FALSE; + repeat + Adr:=suivant_alg3(AdrPrec,BisPrec,AdrFonc,BisFonc,1); + //if i=0 then El_suivant:=Adr; + trouve_element(Adr,Bis); + Btype:=BrancheN[branche_trouve,IndexBranche_trouve].BType; + BisSuiv:=Btype=3; // si aiguillage bis + if (NivDebug=3) then AfficheDebug('Suivant='+IntToSTR(Adr)+ '('+intToSTR(Btype)+')',clyellow); + AdrPrec:=AdrFonc;AdrFonc:=Adr; + BisPrec:=BisFonc;BisFonc:=Bis; + inc(i); + sortie:=(Btype=1) or (Adr=0) or (i=20); + until sortie; + if (i=20) then begin Affiche('Erreur fatale 201 : Itération trop longue',clred); + AfficheDebug('Erreur fatale 201 : Itération trop longue',clred);calcul_zones_det:=3;end; + + // le train vient de det1, quitte det2 et va vers Adr + Mem[det1]:=false; + Mem[det2]:=true; + MemZone[det1,det2]:=FALSE; // efface canton précédent + MemZone[det2,Adr]:=TRUE; // valide le nouveau canton + precedent:=det1; + Actuel:=det2; + Suivant:=Adr; + //if (aff_det) then + //begin Affiche('MemZone '+intToStr(det1)+' 0',clyellow); Affiche('MemZone '+intToStr(det2)+' 1',clyellow); end; + + Affiche('Mem '+IntToSTR(det2)+' à '+IntTOStr(Adr),clyellow); + + //if (echoLog) then writeln(fichier,'itération '+intTOstr(iteration)+' - Mem '+IntToSTR(det2)+' à '+IntToSTR(Adr),clyellow); + calcul_zones_det:=10; + exit; // réussi + end; +end; + + +// renvoie le détecteur de la zone mémoire si la mémoire MemZone[det,xxx] est à 1 +// exemple si MemZone[512,517]=true alors Test_mem_origine(512) renvoie 517, sinon 0 +function Test_mem_origine(det : integer) : integer ; +var i : integer; + trouve : boolean; +begin + i:=513; + 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); +var i,j,k1,k2,BtypeSuiv,Adr_det,etat,Adr,Aig,DetPrec1,DetPrec2,Detprec3,Detprec4,Adr_El_Suiv, + Btype_el_suivant,det_initial,bt,el_suiv : integer ; + bisSuiv,PresTrain,Aff_semaphore,AffSignal,car : boolean; +begin + //if AdrFeu=344 then AffSignal:=true; + if AffSignal then Affiche('Traitement du feu '+intToSTR(Adrfeu),clOrange); + if NivDebug>=1 then AfficheDebug('Traitement du feu '+intToSTR(Adrfeu)+'------------------------------------',clOrange); + i:=index_feu(Adrfeu); + if AdrFeu<>0 then + begin + Adr_det:=Feux[i].Adr_det1; // détecteur sur le signal + Adr_El_Suiv:=Feux[i].Adr_el_suiv1; // adresse élément suivant au feu + Btype_el_suivant:=Feux[i].Btype_suiv1; + etat:=etat_signal_suivant(AdrFeu,1) ; // état du signal suivant + adresse du signal suivant dans Signal_Suivant + + // signaux traités spécifiquement + if (AdrFeu=201) then + begin + //sprintf(Affiche,"Aiguille 27=%d \r\n",aiguillage[27].position);Display(Affiche); + // sprintf(Affiche,"Aiguille 31=%d \r\n",aiguillage[31].position);Display(Affiche); + if ((aiguillage[28].position<>const_droit) and (aiguillage[29].position<>const_droit) and + (aiguillage[31].position=const_devieD)) then + Maj_Etat_Signal(AdrFeu,blanc) else Maj_Etat_Signal(AdrFeu,violet); + envoi_LEB(AdrFeu); + exit; + end; + if (AdrFeu=217) then + begin + if ((aiguillage[24].position<>const_droit) and (aiguillage[26].position<>const_droit)) then + Maj_Etat_Signal(AdrFeu,blanc) else Maj_Etat_Signal(AdrFeu,violet); + envoi_LEB(AdrFeu); + exit; + end; + + + if (Feux[i].aspect=2) then //or (feux[i].check<>nil) then // si carré violet + begin + if carre_signal(AdrFeu) and (Feux[i].aspect=2) then + begin Maj_Etat_Signal(AdrFeu,violet) ; Envoi_signauxCplx; + exit; + end + else if not(carre_signal(AdrFeu)) then //ici ya pas de check and feux[i].check.checked then + begin Maj_Etat_Signal(AdrFeu,blanc);Envoi_signauxCplx; + exit; + end; + end; + + if AffSignal then Affiche('Debut du traitement général',clYellow); + if NivDebug>=2 then AfficheDebug('Début du traitement général',clYellow); + // traitement des feux >3 feux différents de violet (cas général) + if (Feux[i].aspect>=3) and (EtatSignalCplx[AdrFeu]<>violet_F) then + begin + // 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[i].VerrouCarre then + begin + if AffSignal then Affiche('Le feu est verrouillable au carré',clyellow); + if NivDebug>=1 then AfficheDebug('Le feu est verrouillable au carré',clyellow); + // un feu peut être associé à 4 détecteurs (pour 4 voies) + // il faut donc explorer les 4 détecteurs probables + PresTrain:=FALSE; + + j:=1; + repeat + if NivDebug=3 then afficheDebug('Séquence '+IntToSTR(j)+' de recherche des 4 détecteurs précédents-----',clOrange); + if (j=1) then begin det_initial:=feux[i].Adr_det1;Adr_El_Suiv:=feux[i].Adr_el_suiv1; Btype_el_suivant:=feux[i].Btype_suiv1;end; + if (j=2) then begin det_initial:=feux[i].Adr_det2;Adr_El_Suiv:=feux[i].Adr_el_suiv2; Btype_el_suivant:=feux[i].Btype_suiv2;end; + if (j=3) then begin det_initial:=feux[i].Adr_det3;Adr_El_Suiv:=feux[i].Adr_el_suiv3; Btype_el_suivant:=feux[i].Btype_suiv3;end; + if (j=4) then begin det_initial:=feux[i].Adr_det4;Adr_El_Suiv:=feux[i].Adr_el_suiv4; Btype_el_suivant:=feux[i].Btype_suiv4;end; + if (det_initial<>0) then + begin + DetPrec1:=detecteur_suivant(Adr_El_Suiv,Btype_el_suivant=5,det_initial,false); + if DetPrec1<>9999 then // route bloquée par aiguillage mal positionné + begin + DetPrec2:=detecteur_suivant_El(det_initial,False,DetPrec1,false); + if DetPrec2<>9999 then + begin + DetPrec3:=detecteur_suivant_El(DetPrec1,false,DetPrec2,false); + if DetPrec3<>9999 then + begin + //DetPrec4:=detecteur_suivant_det(DetPrec2,DetPrec3); + if AffSignal then Affiche('les détecteurs précédents au feu '+IntToSTR(Adrfeu)+' sont:'+intToSTR(Det_initial)+' '+intToSTR(DetPrec1)+' '+intToSTR(DetPrec2)+' '+intToSTR(DetPrec3)+' ',clyellow); + PresTrain:=//MemZone[DetPrec4,detPrec3] or + MemZone[DetPrec3,detPrec2] or MemZone[DetPrec2,detPrec1] or MemZone[DetPrec1,Det_initial] or presTrain ; + // Affiche('MemZone'+intToSTR(DetPrec3)+' '+IntToSTR(detPrec2) = '+MemZone[DetPrec3,detPrec2] + end; + end; + end; + end; + inc(j); + until (j>=5); + if presTrain and AffSignal Then affiche('présence train feu '+intToSTR(AdrFeu),clorange); + end; + if AffSignal then affiche('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é + car:=carre_signal(AdrFeu); + if AffSignal and car then Affiche('le signal a des aiguilles en talon aval mal positionnées',clYellow); + if (NivDebug>=1) and car then AfficheDebug('le signal a des aiguilles en talon aval mal positionnées',clYellow); + if (Feux[i].aspect>=4) and ( (not(PresTrain) and Feux[i].VerrouCarre) or car) then Maj_Etat_Signal(AdrFeu,carre) + else + begin + // si on quitte le détecteur on affiche un sémaphore : attention tester le sens de circulation + // pour ne pas passer au rouge un feu à contresens. + // trouver la mémoire de zone MemZone[Adr_det,?] qui a déclenché le feu rouge + if AffSignal then Affiche('test du sémaphore',clYellow); + if (NivDebug>=1) then AfficheDebug('test du sémaphore',clYellow); + Aff_semaphore:=test_memoire_zones(AdrFeu); // test si présence train après signal + if Aff_Semaphore then + begin + if AffSignal then Affiche('train après signal-> sémaphore ou carré',clYellow); + if (NivDebug>=1) and car then AfficheDebug('train après signal-> sémaphore ou carré',clYellow); + if testBit(EtatSignalCplx[Adrfeu],carre)=FALSE then Maj_Etat_Signal(AdrFeu,semaphore); + end + else + begin + // si aiguille locale déviée + Aig:=Aiguille_deviee(Adrfeu); + if (aig<>0) and (feux[i].aspect>=9) then // si le signal peut afficher un rappel et aiguille déviée + begin + if AffSignal then Affiche('Aiguille '+intToSTR(aig)+' déviée',clYellow); + if (NivDebug>=1) then AfficheDebug('Aiguille '+intToSTR(aig)+' déviée',clYellow); + EtatSignalCplx[AdrFeu]:=0; + if (aiguillage[aig].vitesse=30) or (aiguillage[aig].vitesse=0) then Maj_Etat_Signal(AdrFeu,rappel_30); + if aiguillage[aig].vitesse=60 then Maj_Etat_Signal(AdrFeu,rappel_60); + + // si signal suivant affiche rappel ou rouge + if (TestBit(etat,rappel_60)) or (testBit(etat,rappel_30)) or (testBit(etat,carre)) or (testBit(etat,semaphore)) + then Maj_Etat_Signal(AdrFeu,jaune) + else + begin + // sinon si signal suivant=jaune + if (TestBit(etat,jaune)) then Maj_Etat_Signal(AdrFeu,jaune_cli); + end; + end + else + // aiguille locale non déviée + // si le signal suivant est rouge + begin + if AffSignal then Affiche('pas d''aiguille déviée',clYellow); + if (NivDebug>=1) then AfficheDebug('pas d''aiguille déviée',clYellow); + if TestBit(etat,carre) or testBit(etat,semaphore) or testBit(etat,semaphore_cli )then Maj_Etat_Signal(AdrFeu,jaune) + else + begin + // si signal suivant affiche rappel + if TestBit(etat,rappel_30) or TestBit(etat,rappel_60) then + begin + EtatSignalCplx[AdrFeu]:=0; + if TestBit(etat,rappel_30) then Maj_Etat_Signal(AdrFeu,ral_30); + if TestBit(etat,rappel_60) then + begin + Maj_Etat_Signal(AdrFeu,ral_60); // si signal suivant est au rappel60, il faut tester s'il est à l'avertissement aussi + if TestBit(etat,jaune) then Maj_Etat_Signal(AdrFeu,jaune_cli); + end; + end + else + // si le signal suivant est jaune + if TestBit(etat,jaune) then Maj_Etat_Signal(AdrFeu,jaune_cli) + else Maj_Etat_Signal(AdrFeu,vert) + end; + end; + end; + end; + end; + end; + envoi_signauxCplx; + AffSignal:=false; +end; + +Procedure Maj_feux; +var i : integer; +begin + Maj_feux_cours:=TRUE; + for i:=1 to NbreFeux do + begin + Maj_feu(Feux[i].Adresse); + end; + Maj_feux_cours:=FALSE; +end; + + +procedure rafraichit; +begin + //Affiche('Procédure rafraichit',cyan); +// calcule_memoires; // mise à jour des mémoires de zone + begin + Maj_feux; + //Maj_feux; + end +end; + +// met à jour le signal adr dont le détecteur vient d'être franchi dans le bon sens +procedure signal(SignalCplx,detecteurAct,detecteurSuiv : integer); +begin + // + if MemZone[detecteurAct,detecteurSuiv] then if testBit(EtatSignalCplx[signalCplx],carre)=FALSE then Maj_Etat_Signal(signalCplx,semaphore); +end; + +// trouve l'index d'un détecteur dans une branche depuis la fin de la branche +// si pas trouvé, renvoie 0 +function index_detecteur_fin(det,Num_branche : integer) : integer; +var dernier,i,j : integer; + trouve : boolean; + procedure recherche; + begin + repeat + if BrancheN[Num_Branche,i].Btype=1 then // cherche un détecteur + begin + j:=BrancheN[Num_Branche,i].adresse; + trouve:=det=j; + end; + if not(trouve) then dec(i); + until trouve or (j=0) + end; +begin + // déterminer la fin de la branche + i:=1; + repeat + inc(i); + until (BrancheN[Num_Branche,i].adresse=0) and (BrancheN[Num_Branche,i].btype=0); + dernier:=i-1; + // Affiche('dernier'+intToSTR(dernier),clwhite); + + // rechercher le détecteur depuis l'index i + i:=dernier;index2_det:=0; + recherche; + if trouve then result:=i else result:=0; + //affiche(inttostr(ai+1),clOrange); + + //affiche('------------------------',clWhite); + recherche; + //affiche('------------------------',clGreen); + if trouve then index2_det:=i else index2_det:=0; + //affiche('index2='+IntToSTR(index2_det),clWhite); +end; + + +// supprime un évènement détecteur dans la liste +procedure supprime_event(i : integer); +var l : integer; +begin + for l:=i to N_Event_det do event_det[l]:=event_det[l+1]; + dec(N_event_det); +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 à jout le tableau MemZone +procedure calcul_zones ; +var i,det1,det2,index_1,index_2,index_3,resultat : integer; + unevalide,traceListe : boolean; + label refaire; +begin + uneValide:=false; + traceListe:=false; + //N_event_det pointe sur le dernier détecteur + refaire: + with FormDebug.MemoEvtDet do + begin + lines.clear; + for index_3:=1 to N_event_det do lines.add(intToSTR(event_det[index_3])); + end; + + if traceListe then + begin + Affiche('Liste',clyellow); + for index_3:=1 to N_event_det do affiche(intToSTR(event_det[index_3]),clyellow); + end; + if N_event_det<2 then begin exit;end; // pas assez de détecteurs pour évaluer + // balayer index 1 à 2 puis 1 à 3 puis 1 à N_event_det et ensuite + // de 2 à 3 puis de 2 à 4 puis de 2 à 5 etc + index_1:=1; + repeat + index_2:=index_1+1; + repeat + det1:=event_det[index_1]; + det2:=event_det[index_2]; + if det1=det2 then // si détecteurs identiques, supprimer le 2eme + begin + if traceListe then Affiche('trouvé doublon',clyellow); + supprime_event(index_2); + if traceListe then for index_3:=1 to N_event_det do affiche(intToSTR(event_det[index_3]),clyellow); + goto refaire; + end; + if traceListe then Affiche('cherche '+intToSTR(det1)+' '+intToSTR(det2)+' '+intToSTR(index_1)+' '+intToSTR(index_2)+' '+intToSTR(N_event_det),clyellow); + resultat:=calcul_zones_det(det1,det2); + if resultat=10 then + begin + FormDebug.MemoEvtDet.lines.add('route traitée de '+intToSTR(det1)+' à '+IntToSTR(det2)); + uneValide:=true; + supprime_event(index_1); + FormDebug.MemoEvtDet.lines.add('Nouveau Tampon:'); + for index_3:=1 to N_event_det do FormDebug.MemoEvtDet.lines.add(intToSTR(event_det[index_3])); + end; + + // détecteur1 non trouvé + if resultat=1 then begin supprime_event(index_1);goto refaire;end; + // détecteur2 non trouvé + if resultat=2 then begin supprime_event(index_2);goto refaire;end; + inc(index_2); + //Affiche('index2='+IntToSTR(index_2),clyellow); + until (index_2>N_event_det); + inc(index_1); + until (index_1>=N_event_det); + // si on a trouvé au moins une route valide, rafraichir les signaux + if uneValide then + begin + rafraichit; + rafraichit; + rafraichit; + end; +end; + + + + +// demande l'état d'un accessoire. Le résultat sera réceptionné sur réception des informations +// de rétrosignalisation. +procedure demande_info_acc(adresse : integer); +var s : string; + n : integer; +begin + // envoyer 2 fois la commande, une fois avec N=0 pour récupérer le nibble bas, + // une autre fois avec N=1 pour récupérer le nibble haut + s:=#$FF+#$FE+#$42+char((adresse-1) div 4); + n:=$80+((adresse-1) mod 4) div 2; + s:=s+char(n); // N=0 (bit 0) + s:=checksum(s); + envoi(s); + + s:=#$FF+#$FE+#$42+char((adresse-1) div 4); + n:=$80+((adresse-1) mod 4) div 2; + s:=s+char(n or 1); // N=1 (bit 0) + s:=checksum(s); + envoi(s); +end; + +// demande l'état de tous les accessoires +procedure demande_etat_acc; +var i : integer; +begin + Affiche('Demande état des aiguillages',ClYellow); + for i:=1 to maxaiguillage do + begin + demande_info_acc(i); + end; +end; + +// le décodage de la rétro est appellée sur une réception d'une trame de la rétrosignalisation. +// On déclenche ensuite le rafraichissement +procedure decode_retro(adresse,valeur : integer); +var s : string; + adraig,bitsITT,i : integer; +begin + //affiche(IntToSTR(adresse)+intToSTR(valeur),clorange); + bitsITT:=(valeur and $E0); + // bit à 010X XXXX = c'est un module de rétrosignalisation (pas un aiguillage) + // doc LENZ Xpressnet protocol description page 31 + detecteur_chgt:=0; + dem_calcul_zone:=false; + if (valeur and $10)=$10 then // si bit N=1, les 4 bits de poids faible sont les 4 bits de poids fort du décodeur + begin + // détermine le détecteur qui a changé d'état + // -------état du détecteur + if bitsITT=$40 then // module de rétro = détecteur + begin + // affecter l'état des détecteurs + i:=adresse*8+8; + if detecteur[i]<>((valeur and $8) = $8) then // si changement de l'état du détecteur bit 7 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $8) = $8; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + + i:=adresse*8+7; + if detecteur[i]<>((valeur and $4) = $4) then // si changement de l'état du détecteur bit 6 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $4) = $4; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + + i:=adresse*8+6; + if detecteur[i]<>((valeur and $2) = $2) then // si changement de l'état du détecteur bit 5 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $2) = $2; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + + i:=adresse*8+5; + if detecteur[i]<>((valeur and $1) = $1) then // si changement de l'état du détecteur bit 4 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $1) = $1; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + end; + + // état de l'aiguillage + if bitsITT=$00 then // module d'aiguillages, N=1 + begin + adraig:=((adresse * 4)+1 ); // *4 car N=1, c'est le "poids fort" + if (valeur and $C)=$8 then + begin + aiguillage[adraig+3].position:=2 ; // état aiguillage haut + if trace then begin s:='accessoire '+intToSTR(adraig+3)+'=2';Affiche(s,clYellow);end; + end; + if (valeur and $C)=$4 then + begin + aiguillage[adraig+3].position:=1 ; // état aiguillage haut + if trace then begin s:='accessoire '+intToSTR(adraig+3)+'=1';Affiche(s,clYellow);end; + end; + if (valeur and $3)=$2 then + begin + aiguillage[adraig+2].position:=2; // état aiguillage bas + if trace then begin s:='accessoire '+intToSTR(adraig+2)+'=2';Affiche(s,clYellow);end; + end; + if (valeur and $3)=$1 then + begin + aiguillage[adraig+2].position:=1; // état aiguillage bas + if trace then begin s:='accessoire '+intToSTR(adraig+2)+'=1';Affiche(s,clYellow);end; + end; + end; + end; + + if (valeur and $10)=$00 then // si bit N=0, les 4 bits de poids faible sont les 4 bits de poids faible du décodeur + begin + //Affiche('N=0',clYellow); + if bitsITT=$40 then // module de rétro + begin + // affecter l'état des détecteurs + i:=adresse*8+4; + if detecteur[i]<>((valeur and $8) = $8) then // si changement de l'état du détecteur bit 7 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $8) = $8; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + + i:=adresse*8+3; + if detecteur[i]<>((valeur and $4) = $4) then // si changement de l'état du détecteur bit 6 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $4) = $4; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + + i:=adresse*8+2; + if detecteur[i]<>((valeur and $2) = $2) then // si changement de l'état du détecteur bit 5 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $2) = $2; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + + i:=adresse*8+1; + if detecteur[i]<>((valeur and $1) = $1) then // si changement de l'état du détecteur bit 4 + begin + ancien_detecteur[i]:=detecteur[i]; + detecteur[i]:=(valeur and $1) = $1; + detecteur_chgt:=i; + // mise a jour du tableau evt + if ancien_detecteur[i] and not(detecteur[i]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=i; + dem_calcul_zone:=true; + end; + if AfficheDet then begin s:='detecteur '+inttoSTR(i)+'=';if detecteur[i] then s:=s+'1' else s:=s+'0';Affiche(s,clYellow);end; + end; + + end; + if bitsITT=$00 then // module d'aiguillages + begin + adraig:=(adresse * 4)+1; + if (valeur and $C)=$8 then + begin + aiguillage[adraig+1].position:=2 ; // état aiguillage haut + if trace then begin s:='accessoire '+intToSTR(adraig+1)+'=2';Affiche(s,clYellow);end; + end; + if (valeur and $C)=$4 then + begin + aiguillage[adraig+1].position:=1 ; // état aiguillage haut + if trace then begin s:='accessoire '+intToSTR(adraig+1)+'=1';Affiche(s,clYellow);end; + end; + if (valeur and $3)=$2 then + begin + aiguillage[adraig].position:=2; // état aiguillage bas + if trace then begin s:='accessoire '+intToSTR(adraig)+'=2';Affiche(s,clYellow);end; + end; + if (valeur and $3)=$1 then + begin + aiguillage[adraig].position:=1; // état aiguillage bas + if trace then begin s:='accessoire '+intToSTR(adraig)+'=1';Affiche(s,clYellow);end; + end; + + end; + end; + //if test_leb=false then rafraichit; + if dem_calcul_zone then calcul_zones; + //Affiche('Rafraichit',clorange); +end; + +function decode_chaine_retro(s : string) : string; +var i : integer; + chaineInt : string; +begin + chaineInt:=s; + i:=pos(#$FF+#$FD+#$42,chaineInt); + if (i<>0) and (length(chaineInt)>=5) then + begin + delete(chaineInt,i,3); + decode_retro(ord(chaineInt[i]),ord(chaineInt[i+1])); + delete(chaineInt,i,3); + end + else + begin + i:=pos(#$FF+#$FD+#$81,chaineInt); + if (i<>0) and (length(chaineInt)>=5) then + begin + delete(chaineInt,i,5); + Affiche('Voie hors tension msg1',clRed); + end + else + begin + i:=pos(#$FF+#$FD+#$61,chaineInt); + if (i<>0) and (length(chaineInt)>=5) then + begin + delete(chaineInt,i,5); + Affiche('Voie hors tension msg2',clRed); + Hors_tension2:=true; + end + else + begin + i:=pos(#$FF+#$FD+#$46+#$43+#$40,chaineInt); + if (i<>0) and (length(chaineInt)>=6) then + begin + delete(chaineInt,i,6); + Affiche('Reprise msg 1',clOrange); + Hors_tension2:=false; + end + else + begin + i:=pos(#$FF+#$FD+#$46+#$43+#$50,chaineInt); + if (i<>0) and (length(chaineInt)>=6) then + begin + delete(chaineInt,i,6); + Affiche('Reprise msg 2',clOrange); + Hors_tension2:=false; + end + else + begin + affiche('Erreur 2, chaîne rétrosig. inconnue recue:',clRed); + affiche(chaine_HEX(chaineInt),clred); + chaineInt:=''; + end; + end; + end; + end; + end; + decode_chaine_retro:=chaineint; +end; + +// procédure appellée après réception sur le port USB ou socket +procedure interprete_reponse(chaine : string); +var chaineInt,msg : string; + i : integer; + +begin + //if test_leb then exit; + chaineInt:=chaine; + //ack:=false; + //nack:=false; + while length(chaineINT)>=5 do + begin + i:=pos(#$ff+#$fe,chaineINT); + if (i<>0) and (length(chaineINT)>3) then + begin + msg:=''; + delete(chaineINT,i,2); + if chaineINT[1]=#1 then + begin + case chaineINT[i+1] of + #1 : begin nack:=true;msg:='erreur timout transmission';end; + #2 : begin nack:=true;msg:='erreur timout centrale';end; + #3 : begin nack:=true;msg:='erreur communication inconnue';end; + #4 : begin msg:='succès';ack:=true;end; + #5 : begin nack:=true;msg:='plus de time slot';end; + #6 : begin nack:=true;msg:='débordement tampon LI100';end; + end; + if trace and (chaineINT[i+1]=#4) then Affiche(msg,clYellow); + if trace and (chaineINT[i+1]<>#4) then Affiche(msg,clRed); + end + else + begin + if chaineINT[1]=#2 then + begin + ack:=true; + msg:='Version matérielle '+intTohex(ord(chaineINT[2]),2)+' - Version soft '+intToHex(ord(chaineINT[3]),2); + Affiche(msg,clYellow); + end + else + begin + if chaineINT[1]=#$42 then + begin + ack:=true; + delete(chaineInt,1,1); + decode_retro(ord(chaineInt[1]),ord(chaineInt[2])); + end + else + begin + if chaineINT[1]=#$61 then + begin + delete(chaineInt,1,1); + case chaineINT[1] of + #$80 : begin nack:=true;msg:='erreurs de transferts- Voir doc XpressNet p29';end; + #$81 : begin nack:=true;msg:='Station occupée - Voir doc XpressNet p29';end; + #$82 : begin nack:=true;msg:='Commande non implantée';end; + else begin nack:=true;msg:='Réception inconnue';end; + end; + Affiche(msg,clRed); + end; + end; + end; + end; + if length(chaineINT)<=3 then delete(chaineINT,i,length(chaineINT)); + end + else + begin + i:=pos(#$ff+#$fd,chaineINT); + if (i<>0) and (length(chaineINT)>=5) then + chaineINT:=decode_chaine_retro(chaineINT) + else + begin + i:=pos(#$FF+#$FD+#$81,chaineInt); + if (i<>0) and (length(chaineInt)>=6) then + begin + delete(chaineInt,i,6); + Affiche('Court circuit msg 1',clRed); + end + else + begin + affiche('Erreur 1, chaîne rétrosig. inconnue recue:'+chaine_HEX(chaineINT),clred); + chaineINT:=''; + end; + end; + end; + end; +end; + +function HexToStr(s: string) : string ; +// transforme une chaîne 0A FF CA.. en chaine d'octets +var i,long,erreur : integer; + st : string; + v : byte; +begin + long:=length(s); + st:=''; + i:=1; + repeat + val('$'+copy(s,i,2),v,erreur); + st:=st+char(v); + inc(i,3); + until (i>=long); + HexToStr:=st; +end; + +procedure connecte_USB; +begin +// initialisation de la comm USB + if avecMSCom then + begin + if NumPort<>0 then + begin + With Formprinc.Mscomm1 do + begin + Affiche('demande ouverture com'+intToSTR(nuMPort),CLYellow); + Settings:='57600,N,8,1'; + Handshaking:=2; {2=cts } + SThreshold:=1; + RThreshold:=1; + CommPort:=NumPort; + DTREnable:=false; + InputMode:=comInputModeBinary; + end; + //portCommOuvert:=false; + try + Formprinc.MSComm1.portopen:=true; + except + portCommOuvert:=false; + end; + end + else portCommOuvert:=false; + if portCommOuvert then affiche('port COM'+intToSTR(NumPort)+' ouvert',clGreen) else + Affiche('port COM'+intToSTR(NumPort)+' NON ouvert',clRed) ; + if portCommOuvert then ParUSB:=true else ParUSB:=false; + end + else + begin + PortCommOuvert:=false;ParUSB:=false; + end; +end; + +procedure deconnecte_CDM; +begin + with Formprinc do + begin + ClientSocketCDM.close; + end; +end; + +procedure connecte_CDM; +var s : string; +begin + // Initialisation de la comm socket CDM + if CDM_connecte then begin Affiche('CDM déja connecté',Cyan);exit;end; + if AdresseIPCDM<>'0' then + begin + with Formprinc do + begin + ClientSocketCDM.port:=portCDM; + ClientSocketCDM.Address:=AdresseIPCDM; + ClientSocketCDM.Open; + end; + tempo(5); + // connexion à CDM rail + s:='C-C-00-0001-CMDGEN-_CNCT|000|'; + //s:='C-C-00-0001-CMDGEN-_CNCT|019|01|LAY=CAPDEBOUHEYRE;'; + //s:='|01|LAY=CAPDEBOUHEYRE;'; + //s:='|01|LAY=RESEAU_TEST;'; + //s:='C-C-00-0001-CMDGEN-_CNCT|'+format('%.*d',[3,length(s)-1])+s; + envoi_cdm(s); + if pos('_ACK',recuCDM)<>0 then + begin + CDM_connecte:=True; + Id_CDM:=copy(recuCDM,5,2); // récupère l'ID reçu de CDM, à utiliser dans toutes les futures trames + s:='Connecté au serveur CDM rail avec l''ID='+Id_CDM; + Affiche(s,clYellow); + AfficheDebug(s,clyellow); + + // demande des services : ATNT=aiguillages, ADET=détecteurs AACT=actionneurs + s:=place_id('C-C-00-0002-RQSERV-RTSIM|030|03|SRV=ATNT;SRV=ADET;SRV=AACT;'); + envoi_CDM(s); + if pos('_ACK',recuCDM)<>0 then Affiche('Services acceptés: aiguillages - détecteurs - actionneurs',clYellow); + // demande les trains + ////s:=place_id('C-C-01-0002-DSCTRN-DLOAD|000|'); + //envoi_CDM(s); + + s:=chaine_CDM_Acc(23,2); + envoi_CDM(s); + s:=chaine_CDM_Acc(23,0); + envoi_CDM(s); + end; + end + else + begin + Affiche('La connexion a CDM n''est pas demandée car l''adresse IP est nulle dans config.cfg',cyan); + end; +end; + +{$J+} +function IsWow64Process: Boolean; +type + TIsWow64Process = function(hProcess: THandle; var Wow64Process: Boolean): Boolean; stdcall; +var + DLL: THandle; + pIsWow64Process: TIsWow64Process; +const + IsWow64: Boolean = False; +begin + IsWow64:=false; + DLL:=LoadLibrary('kernel32.dll'); + if (DLL<>0) then + begin + pIsWow64Process:=GetProcAddress(DLL,'IsWow64Process'); + if (Assigned(pIsWow64Process)) then + begin + pIsWow64Process(GetCurrentProcess,IsWow64); + end; + FreeLibrary(DLL); + end; + Result:=IsWow64; +end; +{$J-} + +procedure TFormPrinc.FormCreate(Sender: TObject); +var + i : integer; + s : string; +begin + TraceSign:=True; + Caption:=AF; + avecMSCom:=false; + Application.onHint:=doHint; + LabelEtat.Caption:='Initialisations en cours'; + Menu_interface(devalide); + + // ouvre la fenetre debug + FormDebug:=TFormDebug.Create(Application); + FormDebug.Caption:=AF+' debug'; + FormDebug.Show; + DebugOuv:=True; + + if IsWow64Process then s:='OS 64 Bits' + else s:='OS 32 Bits'; + s:=DateToStr(date)+' '+TimeToStr(Time)+' '+s; + Affiche(s,clLime);AfficheDebug(s,ClLime); + + + + NivDebug:=0; + // lecture fichier de configuration + ferme:=false; + CDM_connecte:=false; + pasreponse:=0; + lit_config; + Nbre_recu_cdm:=0; + + connecte_USB; + + AffMem:=true; + + // Initialisation de la comm socket LENZ + if AdresseIP<>'0' then + begin + ClientSocketLenz.port:=port; + ClientSocketLenz.Address:=AdresseIP; + ClientSocketLenz.Open; + end; + + connecte_CDM; + + // Initialisation des images des signaux + NbreImagePLigne:=Formprinc.ScrollBox1.Width div (largImg+5); + + // ajoute une image dynamiquement + for i:=1 to NbreFeux do + begin + cree_image(i); // et initialisation tableaux signaux + end; + + if test_leb then Tempo_init:=0 else Tempo_init:=10; // démarre les initialisation des signaux et des aiguillages dans 1 s + + NombreImages:=0; + + detect_Simule[1]:=519; + detect_Simule[2]:=517; + detect_Simule[3]:=525; + detect_Simule[4]:=528; + detect_Simule[5]:=518; + detect_Simule[6]:=514; + detect_Simule[7]:=522; + detect_Simule[8]:=527; + detect_Simule[9]:=519; + index_simule:=1; + + + //essai + // event_det[1]:=527; + // event_det[2]:=520; + // N_event_det:=2; + //aiguillage[31].Position:=2; + //aiguillage[27].Position:=2; + //traceDet:=true; + // calcul_zones; + //carre_signal(358); + //maj_feu(201); + //etat_signal_suivant(201,1); + //Aiguille_deviee(462); + //i:=detecteur_suivant(23,false,538,false); // donne l'élément suivant de AdrPrec à AdrFonc et dans Bis si c'est un aig bis + // i:=etat_signal_suivant(462,2); + //NivDebug:=3; + //Affiche(IntToSTR(detecteur_suivant_El(531,false,518,false)),clyellow); + //i:=Aiguille_deviee(176); + + +end; + + + +procedure TFormPrinc.MSComm1Comm(Sender: TObject); +var i : integer; +begin + if MSComm1.commEvent=comEvReceive then + begin + TpsRecuCom:=0; + tablo:=MSComm1.Input; + for i:=0 to length(tablo)-1 do + begin + chaine_recue:=chaine_recue+char(tablo[i]); + end; + if trace then affiche(chaine_hex(chaine_recue),clWhite); + interprete_reponse(chaine_recue); + end; +end; + +procedure TFormPrinc.FormClose(Sender: TObject; var Action: TCloseAction); +begin + Ferme:=true; + if portCommOuvert then begin portCommOuvert:=false;MSComm1.Portopen:=false; end; + portCommOuvert:=false; + ClientSocketCDM.close; + ClientSocketLenz.close; + + +end; + +procedure init_aiguillages; +var i,pos : integer; + s : string; +begin + Affiche('Positionnement aiguillages',cyan); + for i:=1 to maxaiguillage do + begin + if aiguillage[i].modele<>0 then // si l'aiguillage existe + begin + pos:=aiguillage[i].position; + s:='Init aiguillage '+intToSTR(i)+'='+intToSTR(pos); + if pos=1 then s:=s+' (dévié)' else s:=s+' (droit)'; + Affiche(s,cyan); + pilote_acc(i,pos,aig); + application.processMessages; + end; + end; + with formprinc do + begin + Menu_interface(valide); + end; + +end; + +procedure simulation; +var s : string; + adr,ts : integer; +begin + timerSimule:=timerSimule+1; + ts:=timerSimule; +{ + if timersimule=60 then + begin + trace:=true; + adr:=(513 div 8) -4 ; + s:=#$FF+#$FD+#$42+Char(adr)+#$11; + s:=checksum(s); + interprete_reponse(s); + end; +} + + //trace:=true; + if ts=60 then + begin + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=70 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=90 then + begin + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=100 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=120 then + begin + Affiche('T=120',clWhite); + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=130 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=150 then + begin + Affiche('T=150',clWhite); + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=160 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=190 then + begin + Affiche('T=190',clWhite); + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=200 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=220 then + begin + Affiche('T=220',clWhite); + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=230 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=260 then + begin + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=270 then + begin + Affiche('T=270',clWhite); + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=29 then + begin + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=30 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + if ts=32 then + begin + adr:=detect_simule[index_simule]; + Affiche(intToSTR(adr),clwhite); + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=true; + rafraichit; + end; + if ts=33 then + begin + adr:=detect_simule[index_simule]; + ancien_detecteur[adr]:=detecteur[adr]; + detecteur[adr]:=false; + rafraichit; + inc(index_simule); + end; + + +end; + + +// timer à 100 ms +procedure TFormPrinc.Timer1Timer(Sender: TObject); +var i,a : integer; +begin + if Tempo_init>0 then dec(Tempo_init); + if Tempo_init=1 then + begin + Affiche('Positionnement des feux',clYellow); + if not(ferme) then envoi_signauxCplx; // initialisation des feux + if not(ferme) and (AvecInitAiguillages=1) then init_aiguillages else // initialisation des aiguillages + if not(ferme) then demande_etat_acc; // demande l'état des accessoires (position des aiguillages) + LabelEtat.Caption:=' '; + end; + + if temps>0 then dec(temps); + + // gestion du clignotant des feux + if tempsCli>0 then dec(tempsCli); + if tempsCli=0 then + begin + tempsCli:=5; + clignotant:=not(clignotant); + //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 + 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" + end; + end; + + // affiche la trame recue de l'interface après 500ms + if TpsRecuCom<5 then inc(TpsRecuCom); + if TpsRecuCom=5 then + begin + if trace then Affiche_chaine_hex(chaine_recue,clFuchsia); // en hexa ascii + chaine_recue:=''; + TpsRecuCom:=6; + end; + + if (not(Maj_feux_cours) and (Tempo_chgt_feux=1)) then Maj_feux(); // mise à jour des feux sur chgt aiguillage + + if (not(Maj_feux_cours) and (Tempo_chgt_feux>0)) then dec(Tempo_chgt_feux); + //simulation; + +end; + +// bouton version +procedure TFormPrinc.BoutVersionClick(Sender: TObject); +var s : string; +begin + s:=hextostr('ff fe f0'); + s:=checksum(s); + envoi(s); +end; + +// bouton de commande d'un accessoire +procedure TFormPrinc.ButtonCommandeClick(Sender: TObject); +var adr,valeur,erreur : integer; +begin + val(EditAdresse.text,adr,erreur); + val(EditVal.Text,valeur,erreur); + pilote_acc(adr,valeur,aig); +end; + +procedure TFormPrinc.EditvalEnter(Sender: TObject); +begin + if (Editval.Text<>'1') and (Editval.Text<>'2') then editval.text:='1'; +end; + +// gestion de la couleur des textes de la list box +procedure TFormPrinc.ListBox1DrawItem(Control: TWinControl; Index: Integer; + Rect: TRect; State: TOwnerDrawState); +begin + //with control as Tlistbox do + with listbox1.Canvas do + begin + Font.color:=Tcolor(ListBox1.Items.Objects[index]); + TextOut(Rect.Left,Rect.Top+4,ListBox1.Items[index]); + end; +end; + +procedure TFormPrinc.BoutonRafClick(Sender: TObject); +begin + rafraichit; +end; + +// erreur sur socket +procedure TFormPrinc.ClientSocketLenzError(Sender: TObject; + Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; + var ErrorCode: Integer); +var s : string; +begin + s:='Erreur '+IntToSTR(ErrorCode)+' socket IP Lenz'; + case ErrorCode of + 10053 : s:=s+': Connexion avortée - Timeout'; + 10054 : s:=s+': Connexion avortée par paire'; + 10060 : s:=s+': Timeout'; + 10061 : s:=s+': Connexion refusée'; + 10065 : s:=s+': Port non connecté'; + end; + affiche(s,ClRed); + afficheDebug(s,ClRed); + parSocket:=false; + ErrorCode:=0; +end; + + +procedure TFormPrinc.ClientSocketCDMError(Sender: TObject; + Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); + var s : string; +begin + s:='Erreur '+IntToSTR(ErrorCode)+' socket IP CDM Rail'; + case ErrorCode of + 10053 : s:=s+': Connexion avortée - Timeout'; + 10054 : s:=s+': Connexion avortée par paire'; + 10060 : s:=s+': Timeout'; + 10061 : s:=s+': Connexion refusée'; + 10065 : s:=s+': Port non connecté'; + end; + affiche(s,ClRed); + afficheDebug(s,ClRed); + parSocket:=false; + ErrorCode:=0; +end; + +// lecture depuis socket +procedure TFormPrinc.ClientSocketLenzRead(Sender: TObject; + Socket: TCustomWinSocket); +var s : string; +begin + s:=ClientSocketLenz.Socket.ReceiveText; + interprete_reponse(s); + if trace then affiche(chaine_hex(s),clWhite); +end; + +procedure TFormPrinc.ButtonTestClick(Sender: TObject); +begin + demande_etat_acc; +end; + +// procédure Event appelée si on clique sur un checkbox des images des feux +procedure TFormprinc.proc_checkBoxFB(Sender : Tobject); +var Index,adr : integer; + coche : boolean; +begin + // récupérer le contenu du Hint dans lequel on avait stocké lors de la création de la checkbox l'index du feu + { + with Sender as TcheckBox do + begin + Index:=StrToInt(hint); + coche:=checked; + end; + adr:=feux[index].adresse;} + Maj_feux ; // évalue l'état des signaux + //envoi_signauxCplx; // et affiche les signaux +end; + + +procedure TFormPrinc.ButtonInfoClick(Sender: TObject); +begin + Affiche('Ce programme pilote des signaux complexes de façon autonome ',ClYellow); + Affiche('En fonction des détecteurs mis à 1 ou 0 par des locomotives',ClYellow); + Affiche('en circulation sur le réseau',ClYellow); + Affiche('Il est nécessaire de renseigner le fichier config.cfg',ClOrange); + Affiche('En vert : Trames envoyées à l''interface',ClWhite); + Affiche('En blanc : Trames reçues de l''interface',ClWhite); + Affiche('En violet : Trames brutes reçues de l''interface',ClWhite); + Affiche('En rouge : erreurs et défauts',ClWhite); + Affiche('En orange : pilotage des signaux',ClWhite); + Affiche('En bleu : pilotage des aiguillages',ClWhite); + Affiche('En jaune : rétrosignalisation reçue depuis l''interface',ClWhite); +end; + +procedure TFormPrinc.BoutCalcZoneClick(Sender: TObject); +var i1,i2 : integer; +begin + i1:=StrToINT(EditDetecteur1.text); + i2:=StrToINT(EditDetecteur2.text); + Event_det[1]:=i1; + Event_det[2]:=i2; + N_event_det:=2; + calcul_zones; +end; + +procedure TFormPrinc.MenuConnecterUSBClick(Sender: TObject); +begin + Hors_tension2:=false; + connecte_USB; +end; + +procedure TFormPrinc.DeconnecterUSBClick(Sender: TObject); +begin + Ferme:=true; + if portCommOuvert then begin portCommOuvert:=false;MSComm1.Portopen:=false; end; + portCommOuvert:=false; + ClientSocketLenz.close; +end; + +procedure TFormPrinc.MenuConnecterEthernetClick(Sender: TObject); +begin +if AdresseIP<>'0' then + begin + ClientSocketLenz.port:=port; + ClientSocketLenz.Address:=AdresseIP; + ClientSocketLenz.Open; + Hors_tension2:=false; + end; +end; + +procedure TFormPrinc.MenuDeconnecterEthernetClick(Sender: TObject); +begin + ClientSocketLenz.Close; +end; + + +function cde_cdm(s : string) : string; +var i : integer; +begin + i:=length(s)-1; + cde_cdm:='0'+IntToSTR(i)+s; +end; + + + +procedure TFormPrinc.locoClick(Sender: TObject); +begin + // vitesse et direction 18 pas + vitesse_loco(3,20,true); +end; + +procedure TFormPrinc.AffEtatDetecteurs(Sender: TObject); +var j,adr,NBranche : integer; + s : string; +begin + for Nbranche:=1 to NbreBranches do + begin + j:=1; + repeat + adr:=BrancheN[Nbranche,j].adresse; + + if (adr<>0) and (BrancheN[Nbranche,j].BType=1) then + begin + s:='Détecteur '+intToSTR(adr)+' = '; + if Detecteur[adr] then s:=s+'1' else s:=s+'0'; + end; + inc(j); // index de branche + until (adr=0) ; + end; + + for j:=1 to NDetecteurs do + begin + s:='Détecteur '+intToSTR(Adresse_detecteur[j])+'='; + if Detecteur[adresse_detecteur[j]] then s:=s+'1' else s:=s+'0'; + Affiche(s,clYellow); + end; +end; + +procedure TFormPrinc.Etatdesaiguillages1Click(Sender: TObject); +var i : integer; + s : string; +begin + Affiche('les positions des aiguillages BIS sont les mêmes que leurs homologues non bis',Cyan); + for i:=1 to MaxAcc do + begin + if aiguillage[i].modele<>0 then + begin + s:='Aiguillage '+IntToSTR(i)+' : '+intToSTR(aiguillage[i].position); + if aiguillage[i].position=1 then s:=s+' (dévié)' else s:=s+' (droit)'; + Affiche(s,clWhite); + end; + end; +end; + + + +procedure TFormPrinc.Codificationdesaiguillages1Click(Sender: TObject); +var i : integer ; + s : string; +begin + Affiche('Codification interne des aiguillages',Cyan); + Affiche('D=position droite S=position déviée P=pointe Z=détecteur',Cyan); + for i:=1 to MaxAiguillage do + begin + s:=IntToSTR(i); + if aiguillage[i].modele<>0 then + begin + if aiguillage[i].modele=1 then s:=s+' Pointe='; + if aiguillage[i].modele=2 then s:=s+' TJD: centre TJD='; + if aiguillage[i].modele=3 then s:=s+' TJS:'; + if aiguillage[i].modele=4 then s:=s+' Triple: Pointe='; + s:=s+IntToSTR(aiguillage[i].APointe)+aiguillage[i].APointeB+ + ' Dévie='+IntToSTR(aiguillage[i].ADevie)+aiguillage[i].ADevieB+ + ' 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); + end + else + s:=s+' absent'; + + Affiche(s,clYellow); + + end; +end; + + + +procedure TFormPrinc.ClientSocketLenzConnect(Sender: TObject; + Socket: TCustomWinSocket); +begin + Affiche('Lenz connecté ',clYellow); + AfficheDebug('Lenz connecté ',clYellow); +end; + +procedure TFormPrinc.ClientSocketCDMConnect(Sender: TObject; + Socket: TCustomWinSocket); +begin + Affiche('CDM Rail connecté ',clYellow); + AfficheDebug('CDM Rail connecté ',clYellow); + parSocketCDM:=True; +end; + +procedure TFormPrinc.ClientSocketCDMRead(Sender: TObject;Socket: TCustomWinSocket); + var i,j,k,erreur, adr,adr2,etat,etataig : integer ; + s,ss : string; + traite,sort : boolean; +begin + inc(Nbre_recu_cdm); + recuCDM:=ClientSocketCDM.Socket.ReceiveText; + + //AfficheDebug('recu de CDM:',clWhite);AfficheDebug(recuCDM,clWhite); + AckCDM:=recuCDM<>''; + if pos('ACK',recuCDM)=0 then + begin + if pos('ERR=200',recuCDM)<>0 then Affiche('Erreur CDM : réseau non chargé',clred); + end; + k:=0; + dem_calcul_zone:=false; + repeat + //Affiche('K='+intToSTR(k)+' longueur='+intToSTR(length(recuCDM)),clyellow); + //Affiche(recuCDM,clwhite); + // évènement aiguillage. Le champ AD2 n'est pas forcément présent + j:=pos('CMDACC-ST_TO',recuCDM); + if j<>0 then + begin + //Affiche(recuCDM,cllime); + i:=posEx('AD=',recuCDM,j);ss:=copy(recuCDM,i+3,10); //Affiche('j='+IntToSTR(j)+' i='+intToSTR(i),clred); + if i0 then begin Delete(recuCDM,j,i+5-j) ;end else + begin + Affiche('Erreur 95',clred); + Affiche('j='+IntToSTR(j)+' i='+intToSTR(i),clred); + Nbre_recu_cdm:=0; + Affiche(recuCDM,clred); + exit; + end; + val(ss,etat,erreur); + + // conversion en position : 1=dévié (CDM envoie 2 ou 1) 2=droit (CDM envoie 0) + if etat=0 then etatAig:=2 else etatAig:=1; + aiguillage[adr].position:=etatAig; + aiguillageB[adr].position:=etatAig; + Tempo_chgt_feux:=10; // demander la mise à jour des feux + //Affiche('Aiguillage '+intToSTR(adr)+'='+IntToStr(etatAig),clYellow); + //Affiche(recuCDM,CLOrange); + //if length(recuCDM)>80 then Affiche(copy(recuCDM,80,length(recuCDM)-80),clOrange); + end; + + + // évènement détecteur + j:=pos('CMDACC-ST_DT',recuCDM); + if j<>0 then + begin + i:=posEx('AD=',recuCDM,j);ss:=copy(recuCDM,i+3,10); + val(ss,adr,erreur); + i:=posEx('STATE=',recuCDM,j);ss:=copy(recuCDM,i+6,10); + Delete(recuCDM,j,i+5-j); + val(ss,etat,erreur); + + ancien_detecteur[adr]:=detecteur[adr]; + Detecteur[adr]:=etat=1; + detecteur_chgt:=adr; + // mise a jour du tableau evt + if ancien_detecteur[adr] and not(detecteur[adr]) and (N_Event_det<20) then + begin + inc(N_event_det); + event_det[N_event_det]:=adr; + dem_calcul_zone:=true; + end; + if AfficheDet then Affiche('Détecteur '+intToSTR(adr)+'='+IntToStr(etat),clYellow); + end ; + inc(k); + //traite:=(k<30) or (pos('CMDACC-ST_TO',recuCDM)<>0) or (pos('CMDACC-ST_DT',recuCDM)<>0) ; + sort:=(k>70) or (pos('CMDACC-ST_TO',recuCDM)=0) and (pos('CMDACC-ST_DT',recuCDM)=0); + until (sort); + //Affiche('Ligne traitée'+recuCDM,clLime); + if k>=70 then begin Affiche('Erreur 90 : Longrestante='+IntToSTR(length(recuCDM)),clred); Affiche(recuCDM,clred); end; + if dem_calcul_zone then begin calcul_zones; end; + Nbre_recu_cdm:=0; +end; + + + +procedure TFormPrinc.ButtonAffDebugClick(Sender: TObject); +begin + formDebug.show; +end; + +procedure TFormPrinc.ConnecterCDMrailClick(Sender: TObject); +begin + connecte_CDM; +end; + +procedure TFormPrinc.DeconnecterCDMRailClick(Sender: TObject); +begin + deconnecte_CDM; +end; + +procedure TFormPrinc.ClientSocketCDMDisconnect(Sender: TObject; + Socket: TCustomWinSocket); +begin + Affiche('CDM rail déconnecté',Cyan); + AfficheDebug('CDM rail déconnecté',Cyan); + CDM_connecte:=False; +end; + + + +end. + diff --git a/VBCTRLS.REG b/VBCTRLS.REG new file mode 100644 index 0000000..bb57eab --- /dev/null +++ b/VBCTRLS.REG @@ -0,0 +1,16 @@ +REGEDIT +HKEY_CLASSES_ROOT\Licenses = Licensing: Copying the keys may be a violation of established copyrights. + +// The 16 bit and 32-bit OCX Professional license follows: +HKEY_CLASSES_ROOT\Licenses\DB4C0D00-400B-101B-A3C9-08002B2F49FB = mgkgtgnnmnmninigthkgogggvmkhinjggnvm + +// The 32 bit OCX Professional license follows: +HKEY_CLASSES_ROOT\Licenses\7BC20EDC-4A42-101B-A3C9-08002B2F49FB = gifblihbhiiihbciocfbkifbqcfcdiebbiqh + +// spin32 DB key +// anibtn DB key +// gauge 7B key +// grid DB key +// keysta DB key +// msoutl DB key +// threed DB key \ No newline at end of file diff --git a/client-GL.cfg b/client-GL.cfg new file mode 100644 index 0000000..6f56ecd --- /dev/null +++ b/client-GL.cfg @@ -0,0 +1,81 @@ +/****************************************** +/ fichier de configuration de client-GL.log +/ gily - f1iwq - 2018 +/****************************************** +/ ce programme permet de commander les signaux complexes avec ou sans +/ CDM rail. Il a trois modes de fonctionnement: +/ +/ Mode 1 = sans CDM rail. Le programme ne gère que la centrale LENZ ou compatible. +/ Il faut connecter le PC en USB ou par éthernet à la centrale (nécessite l'interface LI100 ETH) +/ +/ Mode 2 = Avec CDM rail, ce programme doit être connecté au réseau par l'interface +/ ethernet ; CDM est connecté par USB, et dans ce cas, +/ mettre 0 dans le numéro de port COM (inutilisé) ainsi que la variable avec ou sans initialisation +/ des aiguillages à 0. +/ +/ Mode 3 = Avec CDM Rail, ce programme connecté au réseau par l'interface Ethernet et CDM +/ Rail est connecté au réseau par l'USB. +/ +/ +/ Taille de la fonte de la fenêtre +16 +/ +/ Adresse IP V4 du PC sur lequel s'execute CDM : port +127.0.0.1:9999 +/ +/ Adresse IP V4 de l'interface LI-USB Ethernet : port +/ par défaut le port est 5550 +/ ne pas connecter le port ou mettre 0 si on travaille avec l'interface USB +192.168.1.23:5550 +/ +/ port COM de l'adresse USB de l'interface LI100 +/ attention de 1 à 9 - Si le port de l'interface USB LI100 >9, il faut le changer +/ manuellement dans le gestionnaire des périphériques +/ mettre 0 si inutilisée ou si CDM est utilisé en parallèle de ce programme (car CDM utilise la liaison USB) +/ Le programme ne tentera pas de se connecter à la centrale si CDM rail est détécté +/ +3 +/ +/ Avec (1) ou sans (0) initialisation des aiguillages au démarrage selon le tableau ci après +0 +/ +/ Valeurs des initialisations des aiguillages au démarrage ----------------------------------------------- +/ @ aiguillage, position 1=dévié 2=droit, temporisation de manoeuvre en 1/10eme de seconde , +/ 0=pilotage normal 1=pilotage inversé +/ une position différente de 1 ou 2 sera à 1. Une temporisation de 0 sera à 5. +/ la liste doit être terminée par 0,0,0 +1,2,3,0 +2,2,3,0 +3,2,3,0 +4,2,3,0 +5,1,3,0 +6,2,3,0 +7,1,3,0 +8,2,3,0 +9,2,3,0 +10,2,3,0 +11,2,3,0 +12,1,3,0 +13,1,3,0 +14,1,3,0 +15,1,3,0 +16,1,4,0 +17,1,3,0 +18,2,4,0 +19,1,4,0 +20,2,4,0 +21,2,3,0 +22,1,3,0 +23,1,3,0 +24,1,3,0 +25,1,3,0 +26,2,3,0 +27,2,3,0 +28,2,3,0 +29,2,3,0 +30,2,3,0 +31,1,3,0 +32,1,3,0 +0,0,0,0 +/ + diff --git a/client-GL.~cfg b/client-GL.~cfg new file mode 100644 index 0000000..49ef08b --- /dev/null +++ b/client-GL.~cfg @@ -0,0 +1,41 @@ +/****************************************** +/ fichier de configuration de client-GL.log +/ gily - f1iwq - 2018 +/****************************************** +/ ce programme permet de commander les signaux complexes avec ou sans +/ CDM rail. Il a trois modes de fonctionnement: +/ +/ Mode 1 = sans CDM rail. Le programme ne gère que la centrale LENZ ou compatible. +/ Il faut connecter le PC en USB ou par éthernet à la centrale (nécessite l'interface LI100 ETH) +/ +/ Mode 2 = Avec CDM rail, ce programme doit être connecté au réseau par l'interface +/ ethernet ; CDM est connecté par USB, et dans ce cas, +/ mettre 0 dans le numéro de port COM (inutilisé) ainsi que la variable avec ou sans initialisation +/ des aiguillages à 0. +/ +/ Mode 3 = Avec CDM Rail, ce programme connecté au réseau par l'interface Ethernet et CDM +/ Rail est connecté au réseau par l'USB. +/ +/ +/ Taille de la fonte de la fenêtre +16 +/ +/ Adresse IP V4 du PC sur lequel s'execute CDM : port +127.0.0.1:9999 +/ +/ Adresse IP V4 de l'interface LI-USB Ethernet : port +/ par défaut le port est 5550 +/ ne pas connecter le port ou mettre 0 si on travaille avec l'interface USB +192.168.1.23:5550 +/ +/ port COM de l'adresse USB de l'interface LI100 +/ attention de 1 à 9 - Si le port de l'interface USB LI100 >9, il faut le changer +/ manuellement dans le gestionnaire des périphériques +/ mettre 0 si inutilisée ou si CDM est utilisé en parallèle de ce programme (car CDM utilise la liaison USB) +/ Le programme ne tentera pas de se connecter à la centrale si CDM rail est détécté ( +/ +3 +/ +/ Avec (1) ou sans (0) initialisation des aiguillages au démarrage selon le tableau ci après +1 +/ \ No newline at end of file diff --git a/config.cfg b/config.cfg new file mode 100644 index 0000000..15fd99f --- /dev/null +++ b/config.cfg @@ -0,0 +1,112 @@ +/****************************************** +/ fichier de configuration de signaux complexes +/ cap de bouheyre avec signaux - 2018 +/**************************************** +/ Sans Log=0 / Avec Log=1 : génère un fichier log +Log=0 +/ Affichage du débug du calcul des routes, et enregistrement dans le log si la variable précédente est à 1 +TraceDet=0 +/ si 1 envoie un 0 après le pilotage des décodeurs LEB +RazSignaux=0 +/ +/ modélisation des aiguillages : détermine les éléments connectés aux 3 branches des aiguilles (Pointe, Droit, Dévié (S) +/ adresse d'aiguillage[B],P=élément vers pointe D=élément vers Droit, S=élément vers dévié +/ B pour adresse d'aiguillage déja utilisée +/ Elément = détecteur (valeur uniquement numérique) ou aiguillage (adresse [TRI,TJS,TJD]+branche de connexion (P S ou D) +/ Exemples : 1,P518,D523,S3P signifie : définition de l'aiguillage @1 : sur pointe relié au détecteur 518 +/ sur Droit relié au détecteur 518 +/ sur Dévié, relié à l'aiguillage 3 en pointe +/ Voir la documentation des signaux complexes pour une description complete +/ S'il n'y a pas de détecteur connecté à une branche d'aiguillage, mettre 0. +1,P2P,D3P,S1BS +1B,P553,D16P,S1S +2,P1P,D4P,S2BS +2B,P521,D16D,S2S +3,P1D,D522,S5BP +4,P2D,D554,S6BP +5,P9P,S15P,D5BS +5B,P3S,S5D,D545 +6,P10P,S546,D6BS +6B,P4S,D545,S6D +7,P15S,D566,S565 +8,P20P,D566,S565 +9,P5P,D530,S17P +10,P6P,D530,S18P +13,P17S,D563,S564 +14,P18S,D563,S564 +15,P5S,D546,S7P +16,P1BD,S16BS,D2BD +16B,P0,S16S,D557 +17,P9S,D531,S13P +18,P10S,D562,S14P +20,P8P,D547,S0 +21,P25P,S537,D23S +22,P24P,S561,D25S +23,P569,S21D,D538 +24,P22P,S26P,D513 +25,P21P,S22D,D570 +26,P24S,S515,D514 +28,P30P,S29P,D570 +29,P28S,D516,S31P +30,P28P,D32S,S539 +31TRI,27,P28S,D518,S0,S2-517 +32,P571,D538,S30D +0 +// +/ modélisation du réseau par branche +/ 1 ligne par branche - le sens de parcours de la description n'a pas d'importance. +/ Chaque ligne (branche) doit comporter au moins un détecteur et au moins aiguillage +/ @ détecteur A=@aiguillage +/ chaque ligne doit commencer par un aiguillage et se terminer par un aiguillage +/ Terminer par les brances par 0 +/ Exemple : 519 est un détecteur - A2 est l'aiguillage 2 - A1B est l'aiguillage 1bis +/ +/ rouge - jaune +A20,547,561,A22,A24,A26,515,518,A31,A29,A28,A30,539,522,A3,A1,A2,A4,A6B,545,A5B,A3 +A26,514,517,A31 +A26,515,518,A31 +A24,513,516,A29 +/grande boucle extérieure départ de couche rouge: de 569 à 569 +A23,538,A32,571,553,A1B,A16,A2B,521,569,A23 +/ grande boucle intérieure +A21,A25,570,A28 +A4,554,537,A21 +/ couche jaune +A10,530,A9,A5,A15,546,A6 +A18,562,531,A17 +A14,563,A13 +A14,564,A13 +/ +A7,565,A8 +A7,566,A8 +A16B,557,0 +0 +/ +/ liste des signaux +/ la liste doit être terminée par une adresse à 0 +/ forme : 2=2 feux(carré violet/blanc) / 3=3 feux / 4=4 feux (carré) / 5=5 feux (carré + blanc) +/ 7=7 feux (carré+blanc + ralentissement / 9=9 feux (blanc ou violet + rappel ralentissement) +/ type de décodeur : 0=feu virtuel 1=digital Bahn 2=CDF 3=LDT 4=LEB +/ l'énumération des détecteurs ne nécessite pas de parenthèses si il est seul, mais il faut des parenthèses si +/ le signal concerne plusieurs voies (donc détecteurs) +/ Notation de chaque ligne: +/ adresse de base du signal, forme, réserve, type de décodeur [, (détecteur,..detecteur , élément suivant ..) , +/ avec ou sans demande de verrouillage du feu au carré (0 ou 1)] +161,4,0,4,(538,A32),0 +169,9,0,4,(539,A30),0, +177,9,0,4,(569,A23),0 +185,4,0,4,(570,A25),0 +193,4,0,4,(516,A29),0 +201,2,0,4,(517,31TRI,518,31TRI),0 +209,9,0,4,(561,547),0 +217,2,0,4,(514,A26,515,A26),0 +225,9,0,4,(516,A29),0 +233,4,0,4,(547,A20),0 +1001,3,0,0,(537,554),0 +1003,3,0,0,(553,A1B),0 +1005,3,0,0,(571,553),0 +1007,3,0,0,(554,A4),0 +1009,3,0,0,(522,539),0 +1011,3,0,0,(521,569),0 +1013,3,0,0,(565,A7),0 +0 diff --git a/config.~cfg b/config.~cfg new file mode 100644 index 0000000..a12ae95 --- /dev/null +++ b/config.~cfg @@ -0,0 +1,112 @@ +/****************************************** +/ fichier de configuration de signaux complexes +/ cap de bouheyre avec signaux - 2018 +/**************************************** +/ Sans Log=0 / Avec Log=1 : génère un fichier log +Log=0 +/ Affichage du débug du calcul des routes, et enregistrement dans le log si la variable précédente est à 1 +TraceDet=0 +/ si 1 envoie un 0 après le pilotage des décodeurs LEB +RazSignaux=0 +/ +/ modélisation des aiguillages : détermine les éléments connectés aux 3 branches des aiguilles (Pointe, Droit, Dévié (S) +/ adresse d'aiguillage[B],P=élément vers pointe D=élément vers Droit, S=élément vers dévié +/ B pour adresse d'aiguillage déja utilisée +/ Elément = détecteur (valeur uniquement numérique) ou aiguillage (adresse [TRI,TJS,TJD]+branche de connexion (P S ou D) +/ Exemples : 1,P518,D523,S3P signifie : définition de l'aiguillage @1 : sur pointe relié au détecteur 518 +/ sur Droit relié au détecteur 518 +/ sur Dévié, relié à l'aiguillage 3 en pointe +/ Voir la documentation des signaux complexes pour une description complete +/ S'il n'y a pas de détecteur connecté à une branche d'aiguillage, mettre 0. +1,P2P,D3P,S1BS +1B,P553,D16P,S1S +2,P1P,D4P,S2BS +2B,P521,D16D,S2S +3,P1D,D522,S5BP +4,P2D,D554,S6BP +5,P9P,S15P,D5BS +5B,P3S,S5D,D545 +6,P10P,S546,D6BS +6B,P4S,D545,S6D +7,P15S,D566,S565 +8,P20P,D566,S565 +9,P5P,D530,S17P +10,P6P,D530,S18P +13,P17S,D563,S564 +14,P18S,D563,S564 +15,P5S,D546,S7P +16,P1BD,S16BS,D2BD +16B,P0,S16S,D557 +17,P9S,D531,S13P +18,P10S,D562,S14P +20,P8P,D547,S0 +21,P25P,S537,D23S +22,P24P,S561,D25S +23,P569,S21D,D538 +24,P22P,S26P,D513 +25,P21P,S22D,D570 +26,P24S,S515,D514 +28,P30P,S29P,D570 +29,P28S,D516,S31P +30,P28P,D32S,S539 +31TRI,27,P28S,D518,S0,S2-517 +32,P571,D538,S30D +0 +// +/ modélisation du réseau par branche +/ 1 ligne par branche - le sens de parcours de la description n'a pas d'importance. +/ Chaque ligne (branche) doit comporter au moins un détecteur et au moins aiguillage +/ @ détecteur A=@aiguillage +/ chaque ligne doit commencer par un aiguillage et se terminer par un aiguillage +/ Terminer par les brances par 0 +/ Exemple : 519 est un détecteur - A2 est l'aiguillage 2 - A1B est l'aiguillage 1bis +/ +/ rouge - jaune +A20,547,561,A22,A24,A26,515,518,A31,A29,A28,A30,539,522,A3,A1,A2,A4,A6B,545,A5B,A3 +A26,514,517,A31 +A26,515,518,A31 +A24,513,516,A29 +/grande boucle extérieure départ de couche rouge: de 569 à 569 +A23,538,A32,571,553,A1B,A16,A2B,521,569,A23 +/ grande boucle intérieure +A21,A25,570,A28 +A4,554,537,A21 +/ couche jaune +A10,530,A9,A5,A15,546,A6 +A18,562,531,A17 +A14,563,A13 +A14,564,A13 +/ +A7,565,A8 +A7,566,A8 +A16B,557,0 +0 +/ +/ liste des signaux +/ la liste doit être terminée par une adresse à 0 +/ forme : 2=2 feux(carré violet/blanc) / 3=3 feux / 4=4 feux (carré) / 5=5 feux (carré + blanc) +/ 7=7 feux (carré+blanc + ralentissement / 9=9 feux (blanc ou violet + rappel ralentissement) +/ type de décodeur : 0=feu virtuel 1=digital Bahn 2=CDF 3=LDT 4=LEB +/ l'énumération des détecteurs ne nécessite pas de parenthèses si il est seul, mais il faut des parenthèses si +/ le signal concerne plusieurs voies (donc détecteurs) +/ Notation de chaque ligne: +/ adresse de base du signal, forme, réserve, type de décodeur [, (détecteur,..detecteur , élément suivant ..) , +/ avec ou sans demande de verrouillage du feu au carré (0 ou 1)] +161,4,0,4,(538,A32),0 +169,9,0,4,(539,A30),0, +177,9,0,4,(569,A23),0 +185,4,0,4,(570,A25),0 +193,4,0,4,(516,A29),0 +201,2,0,4,(517,31TRI,518,31TRI),0 +209,9,0,4,(561,547),0 +217,2,0,4,(514,A26,515,A26),0 +225,9,0,4,(516,A29),0 +233,4,0,4,(547,A20),0 +1001,3,0,0,(537,554),0 +1003,3,0,0,(553,A1B),0 +1005,3,0,0,(571,553),0 +1007,3,0,0,(554,A4),0 +1009,3,0,0,(522,539),0 +1011,3,0,0,(521,569),0 +1013,3,0,0,(565,A7),0 +0 diff --git a/config.~~cfg b/config.~~cfg new file mode 100644 index 0000000..ffd6c28 --- /dev/null +++ b/config.~~cfg @@ -0,0 +1,158 @@ +/****************************************** +/ fichier de configuration de comm_lenz +/ gily - f1iwq - 2018 +/****************************************** +/ ce programme permet de commander les signaux complexes avec ou sans +/ CDM rail. Avec CDM rail, ce programme doit être connecté au réseau par l'interface +/ ethernet (nécessite l'interface LI100 ETH) ; CDM est connecté par USB, et dans ce cas, +/ mettre 0 dans le numéro de port COM (inutilisé) ainsi que la variable avec ou sans initialisation +/ des aiguillages à 0. +/ +/ Adresse IP V4 de l'interface LI-USB Ethernet : port +/ ne pas connecter le port ou mettre 0 si on travaille avec l'interface USB +192.168.1.23:5550 +/ +/ port COM de l'adresse USB de l'interface LI100 +/ attention de 1 à 9 - Si le port de l'interface USB LI100 >9, il faut le changer +/ manuellement dans le gestionnaire des périphériques +/ mettre 0 si inutilisée ou si CDM est utilisé en parallèle de ce programme (car CDM utilise la liaison USB) +/4 +4 +/ +/ dernière adresse d'aiguillages du réseau. Si 0, 80 sera utilisé. +32 +/ Avec (1) ou sans (0) initialisation des aiguillages au démarrage selon le tableau ci après +1 +/ Valeurs des initialisations des aiguillages au démarrage ----------------------------------------------- +/ @ aiguillage, position 1=dévié 2=droit, temporisation de manoeuvre en 1/10eme de seconde , +/ 0=pilotage normal 1=pilotage inversé +/ une position différente de 1 ou 2 sera à 1. Une temporisation de 0 sera à 5. +/ la liste doit être terminée par 0,0,0 +1,2,3,0 +2,2,3,0 +3,2,3,0 +4,1,3,0 +5,1,3,0 +6,1,3,0 +7,1,3,0 +8,2,3,0 +9,2,3,0 +10,2,3,0 +11,2,3,0 +12,1,3,0 +13,1,3,0 +14,1,3,0 +15,1,3,0 +16,1,4,0 +17,1,3,0 +18,2,4,0 +19,1,4,0 +20,2,4,0 +21,2,3,0 +22,2,3,0 +23,1,3,0 +24,1,3,0 +25,1,3,0 +26,2,3,0 +27,2,3,0 +28,2,3,0 +29,2,3,0 +30,2,3,0 +31,1,3,0 +32,1,3,0 +0,0,0,0 +/ +/ liste des adresses des signaux et leur forme, pour affichage de l'image correspondante , +/ avec ou sans bouton de commande pour le feu blanc, type de décodeur. +/ la liste doit être terminée par une adresse à 0 +/ adresse de base du signal, forme, avec ou sans bouton de commande du feu blanc, type de décodeur +/ forme : 2=2 feux(carré violet/blanc) / 3=3 feux / 4=4 feux / 5=5 feux (carré + blanc ou violet) +/ 7=7 feux (blanc ou violet + ralentissement / 9=9 feux (blanc ou violet + rappel ralentissement) +/ type de décodeur : 1=digital Bahn 2=CDF 3=LDT +/ +176,7,0,1 +190,7,0,1 +204,9,0,1 +218,7,0,1 +232,2,1,1 +260,9,1,1 +274,3,0,1 +288,7,0,1 +302,9,0,1 +316,7,1,1 +330,7,0,1 +344,9,0,1 +358,9,0,1 +392,3,0,1 +420,7,0,1 +448,7,0,1 +462,9,0,1 +476,9,0,1 +600,7,0,1 +0,0 +/ +/ modélisation des aiguillages : détermine les éléments connectés aux 3 branches des aiguilles (Pointe, Droit, Dévié (S) +/ adresse d'aiguillage,P=élément vers pointe D=élément vers Droit, S=élément vers dévié. +/ Elément = détecteur (valeur uniquement numérique) ou aiguillage (adresse+branche de connexion (P S ou D) +/ Exemple : 1,P518,D523,S3P signifie : définition de l'aiguillage @1 : sur pointe relié au détecteur 518 +/ sur Droit relié au détecteur 518 +/ sur Dévié, relié à l'aiguillage 3 en pointe +/ Pour une TJD : 26TJD,D[28S,529],S[28D,530] +/ D[ ] : éléments connectés à la TJD en position D (droite), le 1er est l'adresse de la 2eme TJD et sa position +/ S[ ] : éléments connectés à la TJD en position S (déviée) , le 2eme est l'élément extérieur à la TJD +/ +/ S'il n'y a pas de détecteur connecté à une branche d'aiguillage, mettre 0. +1,P518,D523,S3P +2,P12S,S5S,D519 +3,P1S,S5D,D4P +4,P3D,S514,D6S +5,P515,S2S,D3S +6,P516,S4D,D0 +7,P527,S520,D519 +8,P527,S522,D521 +9,P526,S515,D513 +10,P19P,S528,D29P +11,P18P,D30D,S525 +12,P517,D20S,S2P +17,P525,D535,S528 +18,P11P,S517,D23P +19,P10P,S518,D22P +20,P520,D21P,S12D +21,P20D,S28D,D28D +22,P19D,S538,D537 +23,P18D,S534,D538 +24,P538,S533,D32S +25,P31S,D529,S27P +26TJD,D[28S,529],S[28D,530] +27,P25S,D530,S537 +28TJD,D[26S,21S],S[26D,21D] +29,P10D,S30S,D513 +30,P524,S29D,D11D +31,P534,S25P,D0 +32,P22S,S24D,D0 +0 +// +/ modélisation du réseau par branche +/ 1 ligne par branche - le sens de parcours de la branche est arbitraire. +/ Chaque ligne (branche) doit commmencer et finir par un détecteur +/ @ détecteur A=@aiguillage +/ Terminer par 0 +/ Exemple : 519 est un détecteur - A2 est l'aiguillage 2 +/ +519,A2,A12,517,A18,A11,A30,524,521,A8,527,A7,519 +527,A7,520,A20,A12,517 +518,A1,A3,A4,514,522,A8,527 +523,526,A9,513,A29,A10,A19,518,A1,523 +526,A9,515,A5,A2,A12,517 +517,A18,A11,525,A17,528,A10,A19,518 +525,A17,535,533,A24,538,A23,A18,A11,A30,524 +520,A20,A21,A28,A26,530,A27,A25,A31,534,A23,A18,A11,A30,524 +520,A20,A21,A28,A26,529,A25,A31,534,A23,A18,A11,A30,524 +513,A29,A10,A19,A22,537,A27,A25,A31,534 +513,A29,A10,A19,A22,A32,A24,538 +0 + + + + + diff --git a/configgily.cfg b/configgily.cfg new file mode 100644 index 0000000..17bfd47 --- /dev/null +++ b/configgily.cfg @@ -0,0 +1,109 @@ +/****************************************** +/ fichier de configuration de signaux_complexes +/ gily - f1iwq - 2018 +/****************************************** +/ Sans Log=0 / Avec Log=1 : génère un fichier log +Log=0 +/ Affichage du débug du calcul des routes, et enregistrement dans le log si la variable précédente est à 1 +TraceDet=0 +/ Envoie un 0 après le pilotage des décodeurs LEB +RazSignaux=0 +/ +/ modélisation des aiguillages : détermine les éléments connectés aux 3 branches des aiguilles (Pointe, Droit, Dévié (S) +/ adresse d'aiguillage,P=élément vers pointe D=élément vers Droit, S=élément vers dévié. +/ [60 ou 30 dans le cas d'un aiguillage en position déviée qui doit être fanchie à 30 ou 60] +/ Elément = détecteur (valeur uniquement numérique) ou aiguillage (adresse+branche de connexion (P S ou D) +/ Exemple : 1,P518,D523,S3P signifie : définition de l'aiguillage @1 : sur pointe relié au détecteur 518 +/ sur Droit relié au détecteur 518 +/ sur Dévié, relié à l'aiguillage 3 en pointe +/ Pour une TJD : 26TJD,D530,S529,P28 +/ P désigne l'autre adresse de la TJD +/ Aiguillage triple +/ +/ S'il n'y a pas de détecteur connecté à une branche d'aiguillage, mettre 0. +1,P518,S3P,D523,30 +2,P12S,S5S,D519 +3,P1S,S5D,D4P +4,P3D,S514,D6S +5,P515,S2S,D3S +6,P516,S4D,D0 +7,P527,S520,D519 +8,P527,S522,D521 +9,P526,S515,D513,60 +10,P19P,S528,D29P,30 +11,P18P,D30D,S525 +12,P517,D20S,S2P +17,P525,D535,S528 +18,P11P,S517,D23P +19,P10P,S531,D22P +20,P520,D21P,S12D +21,P20D,S28D,D28D +22,P19D,S538,D537 +23,P18D,S534,D538 +24,P538,S533,D32S +25,P31S,D529,S27P +26TJD,D530,S529,P28 +28TJD,D21D,S21S,P26 +27,P25S,D530,S537 +29,P10D,S30S,D513,60 +30,P524,S29D,D11D +31,P534,S25P,D0 +32,P22S,S24D,D0 +0 +// +/ modélisation du réseau par branche +/ 1 ligne par branche - le sens de parcours de la branche est arbitraire. +/ Chaque ligne (branche) doit commmencer et finir par un aiguillage +/ Une ligne qui finit par un 0 signifie un heurtoir +/ @ détecteur A=@aiguillage +/ Terminer par 0 +/ Exemple : 519 est un détecteur - A2 est l'aiguillage 2 +/ +A2,A12,517,A18,A11,A30,524,521,A8,527,A7,519,A2 +A7,520,A20,A12 +A1,A3,A4,514,522,A8 +A1,523,526,A9,513,A29,A10,A19,531,518,A1 +A9,515,A5 +A11,525,A17,528,A10 +A17,535,533,A24,538,A23 +A7,520,A20,A21,A28,A26,530,A27,A25,A31,534,A23,A18 +A26,529,A25 +A22,537,A27 +A22,A32,A24 +A6,516,0 +A31,0 +0 +/ liste des adresses des signaux et leur forme, pour affichage de l'image correspondante , +/ avec ou sans bouton de commande pour le feu blanc, type de décodeur. +/ la liste doit être terminée par une adresse à 0 +/ forme : 2=2 feux(carré violet/blanc) / 3=3 feux / 4=4 feux / 5=5 feux (carré + blanc ou violet) +/ 7=7 feux (blanc ou violet + ralentissement / 9=9 feux (blanc ou violet + rappel ralentissement) +/ type de décodeur : 1=digital Bahn 2=CDF 3=LDT 4=LEB +/ Notation de chaque ligne: +/ adresse de base du signal, forme, avec ou sans bouton de commande du feu blanc, type de décodeur [, détecteur (det2, det3, ...) , élément suivant , +/ avec ou sans demande de verrouillage du feu au carré] +176,7,0,1,(520,A20),1 +190,7,0,1,(523,526),1 +204,9,0,1,(527,A7),1 +218,7,0,1,(525,A17),1 +232,2,1,1,(516,A6),1 +260,9,1,1,(518,A1),1 +274,3,0,1,(524,521),1 +288,7,0,1,(522,A8),1 +302,9,0,1,(526,A9),1 +316,7,1,1,(515,A5),1 +330,7,0,1,(519,A2),1 +344,9,0,1,(528,A10),1 +358,9,0,1,(517,A18),1 +392,3,0,1,(535,533),1 +420,7,0,1,(529,A25,530,A27,537,A27),1 +448,7,0,1,(533,A24),1 +462,9,0,1,(513,A29),1 +476,9,0,1,(538,A23),1 +497,9,0,4,(531,A19),1 +600,7,0,1,(521,A8),1 +0 +/ + + + diff --git a/install.bat b/install.bat new file mode 100644 index 0000000..70509f7 --- /dev/null +++ b/install.bat @@ -0,0 +1,22 @@ +@echo off +echo ce script est a executer en mode +echo administrateur (exécuter en tant qu'administrateur) + +echo enregistrement du composant TMScomm32 +regsvr32 %~dp0mscomm32.ocx + +rem détermine si OS 32 ou 64 bits +Set _os_bitness=64 +IF %PROCESSOR_ARCHITECTURE% == x86 ( + IF NOT DEFINED PROCESSOR_ARCHITEW6432 Set _os_bitness=32 + ) +Echo systeme %_os_bitness% bits + +echo copie du composant mscomm32 dans windows +if %_os_bitness%==64 copy %~dp0mscomm32.ocx c:\windows\sysWOW64 +if %_os_bitness%==32 copy %~dp0mscomm32.ocx c:\windows\system32 + +echo enregistrement de la licence du composant +regedit -s %~dp0vbctrls.reg + +pause diff --git a/install2.bat b/install2.bat new file mode 100644 index 0000000..44e0851 --- /dev/null +++ b/install2.bat @@ -0,0 +1,22 @@ +@echo off +echo ce script est a executer en mode +echo administrateur (exécuter en tant qu'administrateur) + +echo enregistrement du composant TMScomm32 +regsvr32 mscomm32.ocx + +rem détermine si OS 32 ou 64 bits +Set _os_bitness=64 +IF %PROCESSOR_ARCHITECTURE% == x86 ( + IF NOT DEFINED PROCESSOR_ARCHITEW6432 Set _os_bitness=32 + ) +Echo systeme %_os_bitness% bits + +echo copie du composant mscomm32 dans windows +if %_os_bitness%==64 copy mscomm32.ocx c:\windows\sysWOW64 +if %_os_bitness%==32 copy mscomm32.ocx c:\windows\system32 + +echo enregistrement de la licence du composant +regedit -s vbctrls.reg + +pause diff --git a/mscomm32.ocx b/mscomm32.ocx new file mode 100644 index 0000000000000000000000000000000000000000..7cec78cc765ebfdc79e38bae984c1ebe80a9dc75 GIT binary patch literal 103744 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%0A)!AR1y!IrAQmhuW(zM0B7 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