Skip to content

Commit c75a17d

Browse files
committed
Upravit prenaseni cisla vlaku do trati na privolavacku.
Viz #93.
1 parent c020179 commit c75a17d

File tree

3 files changed

+168
-56
lines changed

3 files changed

+168
-56
lines changed

src/bloky/TBlokTrat.pas

+59-10
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ TBlkTrat = class(TBlk)
116116
function GetSprIndex(spr:Integer):Integer;
117117
function SprTUsCount(spr:Integer):Integer;
118118

119+
function GetLastUsek():TBlk; overload;
120+
function GetVyluka():boolean;
121+
119122
public
120123
constructor Create(index:Integer);
121124
destructor Destroy(); override;
@@ -141,7 +144,8 @@ TBlkTrat = class(TBlk)
141144
procedure SetSettings(data:TBlkTratSettings);
142145

143146
function IsFirstUvazka(uv:TBlk):boolean;
144-
procedure SprChangeOR(spr:Integer);
147+
procedure SprChangeOR(spr:Integer); overload;
148+
procedure SprChangeOR(spr:Integer; smer:TTratSmer); overload;
145149

146150
procedure AddSpr(spr:Integer); overload;
147151
procedure AddSpr(spr:TBlkTratSouprava); overload;
@@ -160,6 +164,7 @@ TBlkTrat = class(TBlk)
160164

161165
function ChangesSprDir():boolean; // vraci true prave tehdy, kdyz se v trati meni smer soupravy
162166
function GetSprUsek(spr_id:Integer):TSprUsek;
167+
function GetLastUsek(smer:TTratSmer):TBlk; overload;
163168

164169
property uvazkaA:TBlk read GetUvazkaA; // blok uvazky blize zacatku trati
165170
property uvazkaB:TBlk read GetUvazkaB; // blok uvazky blize konci trati
@@ -174,6 +179,8 @@ TBlkTrat = class(TBlk)
174179
property Zadost:boolean read TratStav.zadost write SetTratZadost; // flag probihajici zadosti o tratovy souhlas
175180
property BP:boolean read TratStav.BP write SetBP; // blokova podminka - zavedeni a zruseni; blokova podminka se zavadi obsazenim prvniho useku trati z jizdni cesty, rusi se pri uvolneni posledni soupravy z trati
176181
property SprPredict:TBlkTratSouprava read TratStav.SprPredict write SetSprPredict; // predpovidana souprava do trati
182+
property lastUsek:TBlk read GetLastUsek; // posledni usek trati (smerove zavisle)
183+
property vyluka:boolean read GetVyluka;
177184

178185
// vrati hranicni navestidla
179186
property navLichy:TBlk read GetNavLichy; // hranicni navestidlo trati blize zacatku trati
@@ -588,7 +595,7 @@ procedure TBlkTrat.AddSpr(spr:TBlkTratSouprava);
588595
if (not spr.IsTimeDefined()) then
589596
spr.time := timeHelper.hJOPnow();
590597

591-
writelog('Tra '+Self.GlobalSettings.name+ ' : pøidána souprava '+Soupravy.soupravy[spr.souprava].nazev, WR_SPRPREDAT);
598+
writelog('Tra '+Self.GlobalSettings.name+ ' : pøidána souprava '+Soupravy[spr.souprava].nazev, WR_SPRPREDAT);
592599

593600
Self.Change();
594601
end;
@@ -607,7 +614,7 @@ procedure TBlkTrat.RemoveSpr(spr:Integer);
607614
if (Self.IsSpr(spr)) then
608615
begin
609616
Self.TratStav.soupravy.Delete(Self.GetSprIndex(spr));
610-
writelog('Tra '+Self.GlobalSettings.name+ ' : smazána souprava '+Soupravy.soupravy[spr].nazev, WR_SPRPREDAT);
617+
writelog('Tra '+Self.GlobalSettings.name+ ' : smazána souprava '+Soupravy[spr].nazev, WR_SPRPREDAT);
611618
toChange := true;
612619
end;
613620

@@ -633,22 +640,27 @@ function TBlkTrat.GetSprList(separator:Char):string;
633640

634641
procedure TBlkTrat.SprChangeOR(spr:Integer);
635642
begin
636-
case (Self.Smer) of
643+
Self.SprChangeOR(spr, Self.Smer);
644+
end;
645+
646+
procedure TBlkTrat.SprChangeOR(spr:Integer; smer:TTratSmer);
647+
begin
648+
case (smer) of
637649
TTratSmer.AtoB: begin
638650
if ((Self.uvazkaB as TBlkUvazka).OblsRizeni.Count > 0) then
639-
Soupravy.soupravy[spr].stanice := (Self.uvazkaB as TBlkUvazka).OblsRizeni[0]
651+
Soupravy[spr].stanice := (Self.uvazkaB as TBlkUvazka).OblsRizeni[0]
640652
else
641-
Soupravy.soupravy[spr].stanice := nil;
653+
Soupravy[spr].stanice := nil;
642654
end;//AtoB
643655
TTratSmer.BtoA:begin
644656
if ((Self.uvazkaA as TBlkUvazka).OblsRizeni.Count > 0) then
645-
Soupravy.soupravy[spr].stanice := (Self.uvazkaA as TBlkUvazka).OblsRizeni[0]
657+
Soupravy[spr].stanice := (Self.uvazkaA as TBlkUvazka).OblsRizeni[0]
646658
else
647-
Soupravy.soupravy[spr].stanice := nil;
659+
Soupravy[spr].stanice := nil;
648660
end;//BtoA
649661
end;//case
650662

651-
writelog('Tra '+Self.GlobalSettings.name+ ' : souprava '+Soupravy.soupravy[spr].nazev+' : stanice zmìnìna na '+(Soupravy.soupravy[spr].stanice as TOR).Name, WR_SPRPREDAT);
663+
writelog('Tra '+Self.GlobalSettings.name+ ' : souprava '+Soupravy[spr].nazev+' : stanice zmìnìna na '+(Soupravy[spr].stanice as TOR).Name, WR_SPRPREDAT);
652664
end;
653665

654666
////////////////////////////////////////////////////////////////////////////////
@@ -1042,6 +1054,43 @@ function TBlkTrat.GetSprUsek(spr_id:Integer):TSprUsek;
10421054
end;
10431055
end;
10441056

1057+
////////////////////////////////////////////////////////////////////////////////
1058+
1059+
function TBlkTrat.GetLastUsek():TBlk;
1060+
begin
1061+
Result := Self.GetLastUsek(Self.smer);
1062+
end;
1063+
1064+
function TBlkTrat.GetLastUsek(smer:TTratSmer):TBlk;
1065+
begin
1066+
if (Self.TratSettings.Useky.Count < 1) then
1067+
raise Exception.Create('Tra nemá žádný úsek!');
1068+
1069+
if (smer = TTratSmer.AtoB) then
1070+
Blky.GetBlkByID(Self.TratSettings.Useky[Self.TratSettings.Useky.Count-1], Result)
1071+
else if (smer = TTratSmer.BtoA) then
1072+
Blky.GetBlkByID(Self.TratSettings.Useky[0], Result)
1073+
else
1074+
raise Exception.Create('Tra nemá žádný smìr!');
1075+
end;
1076+
1077+
////////////////////////////////////////////////////////////////////////////////
1078+
1079+
1080+
function TBlkTrat.GetVyluka():boolean;
1081+
var blkUsek:TBlkUsek;
1082+
usek:Integer;
1083+
begin
1084+
for usek in Self.TratSettings.Useky do
1085+
begin
1086+
Blky.GetBlkByID(usek, TBlk(blkUsek));
1087+
if (blkUsek <> nil) then
1088+
if (blkUsek.Vyluka <> '') then
1089+
Exit(true);
1090+
end;
1091+
Result := false;
1092+
end;
1093+
10451094
////////////////////////////////////////////////////////////////////////////////
10461095
////////////////////////////////////////////////////////////////////////////////
10471096
// TBlkTratSouprava
@@ -1117,7 +1166,7 @@ function TBlkTratSouprava.SerializeForPanel(trat:TBlk; sprPredict:Boolean = fals
11171166
else
11181167
Result := Result + PrevodySoustav.ColorToStr(clAqua) + '|';
11191168

1120-
for addr in Soupravy.soupravy[Self.souprava].HVs do
1169+
for addr in Soupravy[Self.souprava].HVs do
11211170
Result := Result + HVDb.HVozidla[addr].Data.Nazev + '|';
11221171
end;
11231172

src/bloky/TBlokTratUsek.pas

+1-1
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,7 @@ procedure TBlkTU.AddSouprava(spr:Integer);
728728
end;
729729

730730
// kontrola zmeny OR trati, ve ktere jen jeden blok
731-
if ((Self.prevTU = nil) and (Self.nextTU = nil)) then
731+
if (((Self.Trat as TBlkTrat).Smer >= TTratSmer.AtoB) and (Self.prevTU = nil) and (Self.nextTU = nil)) then
732732
TBlkTrat(Self.Trat).SprChangeOR(Self.Souprava);
733733
end;
734734

src/jc/TechnologieJC.pas

+108-45
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@ TJC=class
182182
_JCB_TRAT_NO_BP = 75;
183183
_JCB_TRAT_NOT_ZAK = 76;
184184
_JCB_TRAT_STITEK = 77;
185+
_JCB_TRAT_NEPRENOS = 78;
186+
_JCB_TRAT_PRENOS_NAKONEC = 79;
185187

186188
_JCB_ZAMEK_NEUZAMCEN = 80;
187189
_JCB_ZAMEK_NOUZ_ZAVER = 81;
@@ -1393,6 +1395,7 @@ procedure TJC.UpdateStaveni();
13931395
trat:TBlkTrat;
13941396
tu:TBlkTU;
13951397
oblr:TOR;
1398+
tuAdd:TBlkTU;
13961399
begin
13971400
if (not Self.Staveni) then Exit;
13981401

@@ -2028,18 +2031,39 @@ procedure TJC.UpdateStaveni();
20282031
else
20292032
trat := nil;
20302033

2031-
if ((trat <> nil) and (usek.IsSouprava()) and (not lastUsek.IsSouprava()) and
2032-
(lastUsek.typ = _BLK_TU) and ((lastUsek as TBlkTU).InTrat = Self.data.Trat) and
2033-
(trat.Smer = Self.data.TratSmer) and (trat.BP)) then
2034+
if ((trat <> nil) and (usek.IsSouprava()) and (lastUsek.typ = _BLK_TU) and
2035+
((lastUsek as TBlkTU).InTrat = Self.data.Trat)) then
20342036
begin
2035-
trat.AddSpr(TBlkTratSouprava.Create(spri));
2036-
(lastUsek as TBlkTU).poruchaBP := true;
2037-
trat.Change();
2038-
2039-
lastUsek.AddSoupravaL(spri); // tady je jedno jestli zavolat L nebo S
2040-
// v trati muze byt na jednom useku vzdy jen jedna souprava
2041-
// kontrolovano vyse
2042-
usek.RemoveSouprava(spri);
2037+
tuAdd := nil;
2038+
2039+
if (trat.vyluka) then
2040+
begin
2041+
// Pridat soupravu do posledniho bloku trati
2042+
if ((trat.stav.soupravy.Count = 0) and ((trat.GetLastUsek(Self.data.TratSmer) as TBlkTU).Zaver = TZaver.no)) then
2043+
begin
2044+
tuAdd := (trat.GetLastUsek(Self.data.TratSmer) as TBlkTU);
2045+
trat.SprChangeOR(spri, Self.data.TratSmer);
2046+
if (trat.ChangesSprDir()) then
2047+
Soupravy.soupravy[spri].ChangeSmer();
2048+
end;
2049+
end else begin
2050+
if ((not lastUsek.IsSouprava()) and (trat.BP) and (trat.Smer = Self.data.TratSmer)) then
2051+
begin
2052+
// Pridat soupravu do prvniho bloku trati
2053+
tuAdd := (lastUsek as TBlkTU);
2054+
tuAdd.poruchaBP := true;
2055+
end;
2056+
end;
2057+
2058+
if (tuAdd <> nil) then
2059+
begin
2060+
trat.AddSpr(TBlkTratSouprava.Create(spri));
2061+
tuAdd.AddSoupravaL(spri); // tady je jedno jestli zavolat L nebo S
2062+
// v trati muze byt na jednom useku vzdy jen jedna souprava
2063+
// kontrolovano vyse
2064+
trat.Change();
2065+
usek.RemoveSouprava(spri);
2066+
end;
20432067
end;
20442068
end;//if typcesty = vlak
20452069

@@ -3138,48 +3162,64 @@ function TJC.JCBarieraToMessage(Bariera:TJCBariera):TUPOItem;
31383162
_JCB_ZAMEK_NEUZAMCEN : Result[1] := GetUPOLine('Neuzamčen');
31393163
_JCB_ZAMEK_NOUZ_ZAVER : Result[1] := GetUPOLine('Není nouzový závěr');
31403164

3141-
_JCB_USEK_VYLUKA : begin
3165+
_JCB_USEK_VYLUKA : begin
31423166
Result[0] := GetUPOLine('VÝLUKA '+Bariera.blok.name, taCenter, clBlack, clOlive);
31433167
lines := GetLines((Bariera.blok as TBlkUsek).Vyluka, _UPO_LINE_LEN);
3144-
Result[1] := GetUPOLine(lines[0], taLeftJustify, clYellow, $A0A0A0);
3145-
if (lines.Count > 2) then
3146-
Result[2] := GetUPOLine(lines[1], taLeftJustify, clYellow, $A0A0A0);
3147-
lines.Free();
3168+
try
3169+
Result[1] := GetUPOLine(lines[0], taLeftJustify, clYellow, $A0A0A0);
3170+
if (lines.Count > 1) then
3171+
Result[2] := GetUPOLine(lines[1], taLeftJustify, clYellow, $A0A0A0);
3172+
finally
3173+
lines.Free();
3174+
end;
31483175
end;
3149-
_JCB_USEK_STITEK : begin
3176+
3177+
_JCB_USEK_STITEK : begin
31503178
Result[0] := GetUPOLine('ŠTÍTEK '+Bariera.blok.name, taCenter, clBlack, clTeal);
31513179
lines := GetLines((Bariera.blok as TBlkUsek).Stitek, _UPO_LINE_LEN);
3152-
Result[1] := GetUPOLine(lines[0], taLeftJustify, clYellow, $A0A0A0);
3153-
if (lines.Count > 1) then
3154-
Result[2] := GetUPOLine(lines[1], taLeftJustify, clYellow, $A0A0A0);
3155-
lines.Free();
3180+
try
3181+
Result[1] := GetUPOLine(lines[0], taLeftJustify, clYellow, $A0A0A0);
3182+
if (lines.Count > 1) then
3183+
Result[2] := GetUPOLine(lines[1], taLeftJustify, clYellow, $A0A0A0);
3184+
finally
3185+
lines.Free();
3186+
end;
31563187
end;
31573188

3158-
_JCB_VYHYBKA_VYLUKA : begin
3189+
_JCB_VYHYBKA_VYLUKA : begin
31593190
Result[0] := GetUPOLine('VÝLUKA '+Bariera.blok.name, taCenter, clBlack, clOlive);
31603191
lines := GetLines((Bariera.blok as TBlkVyhybka).Vyluka, _UPO_LINE_LEN);
3161-
Result[1] := GetUPOLine(lines[0], taLeftJustify, clYellow, $A0A0A0);
3162-
if (lines.Count > 1) then
3163-
Result[2] := GetUPOLine(lines[1], taLeftJustify, clYellow, $A0A0A0);
3164-
lines.Free();
3192+
try
3193+
Result[1] := GetUPOLine(lines[0], taLeftJustify, clYellow, $A0A0A0);
3194+
if (lines.Count > 1) then
3195+
Result[2] := GetUPOLine(lines[1], taLeftJustify, clYellow, $A0A0A0);
3196+
finally
3197+
lines.Free();
3198+
end;
31653199
end;
31663200

3167-
_JCB_VYHYBKA_STITEK : begin
3201+
_JCB_VYHYBKA_STITEK : begin
31683202
Result[0] := GetUPOLine('ŠTÍTEK '+Bariera.blok.name, taCenter, clBlack, clTeal);
31693203
lines := GetLines((Bariera.blok as TBlkVyhybka).Stitek, _UPO_LINE_LEN);
3170-
Result[1] := GetUPOLine(lines[0], taLeftJustify, clYellow, $A0A0A0);
3171-
if (lines.Count > 1) then
3172-
Result[2] := GetUPOLine(lines[1], taLeftJustify, clYellow, $A0A0A0);
3173-
lines.Free();
3204+
try
3205+
Result[1] := GetUPOLine(lines[0], taLeftJustify, clYellow, $A0A0A0);
3206+
if (lines.Count > 1) then
3207+
Result[2] := GetUPOLine(lines[1], taLeftJustify, clYellow, $A0A0A0);
3208+
finally
3209+
lines.Free();
3210+
end;
31743211
end;
31753212

3176-
_JCB_PREJEZD_STITEK : begin
3213+
_JCB_PREJEZD_STITEK : begin
31773214
Result[0] := GetUPOLine('ŠTÍTEK '+Bariera.blok.name, taCenter, clBlack, clTeal);
31783215
lines := GetLines((Bariera.blok as TBlkPrejezd).Stitek, _UPO_LINE_LEN);
3179-
Result[1] := GetUPOLine(lines[0], taLeftJustify, clYellow, $A0A0A0);
3180-
if (lines.Count > 1) then
3181-
Result[2] := GetUPOLine(lines[1], taLeftJustify, clYellow, $A0A0A0);
3182-
lines.Free();
3216+
try
3217+
Result[1] := GetUPOLine(lines[0], taLeftJustify, clYellow, $A0A0A0);
3218+
if (lines.Count > 1) then
3219+
Result[2] := GetUPOLine(lines[1], taLeftJustify, clYellow, $A0A0A0);
3220+
finally
3221+
lines.Free();
3222+
end;
31833223
end;
31843224

31853225
_JCB_PRIVOLAVACKA : begin
@@ -3466,6 +3506,8 @@ procedure TJC.PodminkyNCStaveni(var bariery:TList<TJCBariera>);
34663506
var i:Integer;
34673507
Blk,blk2:TBlk;
34683508
glob:TBlkSettings;
3509+
usek, lastUsek:TBlkUsek;
3510+
trat:TBlkTrat;
34693511
begin
34703512
// useky:
34713513
for i := 0 to Self.fproperties.Useky.Count-1 do
@@ -3595,22 +3637,41 @@ procedure TJC.PodminkyNCStaveni(var bariery:TList<TJCBariera>);
35953637
end;
35963638
end;
35973639

3598-
Blky.GetBlkByID(Self.fproperties.Trat, Blk);
3599-
glob := Blk.GetGlobalSettings();
3640+
Blky.GetBlkByID(Self.fproperties.Trat, TBlk(trat));
3641+
glob := trat.GetGlobalSettings();
36003642

3601-
if (((blk as TBlkTrat).ZAK) and (Self.fproperties.TypCesty = TJCType.vlak)) then
3643+
if ((trat.ZAK) and (Self.fproperties.TypCesty = TJCType.vlak)) then
36023644
bariery.Add(Self.JCBariera(_JCB_TRAT_ZAK, blk, Self.fproperties.Trat));
3603-
if ((not (blk as TBlkTrat).ZAK) and (Self.fproperties.TypCesty = TJCType.posun)) then
3645+
if ((not trat.ZAK) and (Self.fproperties.TypCesty = TJCType.posun)) then
36043646
bariery.Add(Self.JCBariera(_JCB_TRAT_NOT_ZAK, blk, Self.fproperties.Trat));
3605-
if ((blk as TBlkTrat).Zaver) then
3647+
if (trat.Zaver) then
36063648
bariery.Add(Self.JCBariera(_JCB_TRAT_ZAVER, blk, Self.fproperties.Trat));
3607-
if ((blk as TBlkTrat).Zadost) then
3649+
if (trat.Zadost) then
36083650
bariery.Add(Self.JCBariera(_JCB_TRAT_ZADOST, blk, Self.fproperties.Trat));
3609-
if ((((blk as TBlkTrat).GetSettings().zabzar = TTratZZ.souhlas) or ((blk as TBlkTrat).GetSettings().zabzar = TTratZZ.nabidka) or (((blk as TBlkTrat).GetSettings().zabzar = TTratZZ.bezsouhas) and ((blk as TBlkTrat).nouzZaver)))
3610-
and (Self.fproperties.TratSmer <> (blk as TBlkTrat).Smer)) then
3651+
if (((trat.GetSettings().zabzar = TTratZZ.souhlas) or
3652+
(trat.GetSettings().zabzar = TTratZZ.nabidka) or
3653+
((trat.GetSettings().zabzar = TTratZZ.bezsouhas) and (trat.nouzZaver)))
3654+
and (Self.fproperties.TratSmer <> trat.Smer)) then
36113655
bariery.Add(Self.JCBariera(_JCB_TRAT_NESOUHLAS, blk, Self.fproperties.Trat));
3612-
if ((not (blk as TBlkTrat).BP) and (Self.fproperties.TypCesty = TJCType.vlak)) then
3656+
if ((not trat.BP) and (Self.fproperties.TypCesty = TJCType.vlak)) then
36133657
bariery.Add(Self.JCBariera(_JCB_TRAT_NO_BP, blk, Self.fproperties.Trat));
3658+
3659+
usek := (Self.navestidlo as TBlkSCom).UsekPred as TBlkUsek;
3660+
Blky.GetBlkByID(Self.data.Useky[Self.data.Useky.Count-1], TBlk(lastUsek));
3661+
3662+
if ((usek.IsSouprava) and (lastUsek.typ = _BLK_TU) and ((lastUsek as TBlkTU).InTrat = Self.data.Trat)) then
3663+
begin
3664+
if (trat.vyluka) then
3665+
begin
3666+
if ((trat.stav.soupravy.Count > 0) or ((trat.GetLastUsek(Self.data.TratSmer) as TBlkTU).Zaver <> TZaver.no)) then
3667+
bariery.Add(Self.JCBariera(_JCB_TRAT_NEPRENOS, trat, Self.fproperties.Trat))
3668+
else
3669+
bariery.Add(Self.JCBariera(_JCB_TRAT_PRENOS_NAKONEC, trat, Self.fproperties.Trat));
3670+
end else begin
3671+
if ((lastUsek.IsSouprava()) or (not trat.BP) or (trat.Smer <> Self.data.TratSmer)) then
3672+
bariery.Add(Self.JCBariera(_JCB_TRAT_NEPRENOS, trat, Self.fproperties.Trat));
3673+
end;
3674+
end;
36143675
end;
36153676

36163677
// kontrola uzamceni zamku:
@@ -3682,6 +3743,8 @@ function TJC.BarieryNCToPotvr(bariery:TJCBariery):TPSPodminky;
36823743
_JCB_TRAT_ZADOST : Result.Add(TOR.GetPSPodminka(bariery[i].blok, 'Probíhá žádost'));
36833744
_JCB_TRAT_NESOUHLAS : Result.Add(TOR.GetPSPodminka(bariery[i].blok, 'Nesouhlas'));
36843745
_JCB_TRAT_NO_BP : Result.Add(TOR.GetPSPodminka(bariery[i].blok, 'Bloková podmínka nezavedena'));
3746+
_JCB_TRAT_NEPRENOS : Result.Add(TOR.GetPSPodminka(bariery[i].blok, 'Nedojde k přenosu čísla vlaku'));
3747+
_JCB_TRAT_PRENOS_NAKONEC : Result.Add(TOR.GetPSPodminka(bariery[i].blok, 'Vlak bude přenesen až na konec trati'));
36853748

36863749
_JCB_ZAMEK_NEUZAMCEN : Result.Add(TOR.GetPSPodminka(bariery[i].blok, 'Neuzamčen'));
36873750
_JCB_ZAMEK_NOUZ_ZAVER : Result.Add(TOR.GetPSPodminka(bariery[i].blok, 'Není zaveden nouzový závěr'));

0 commit comments

Comments
 (0)