Skip to content

Commit 835b10c

Browse files
committed
Umoznit stavet JC jako AB.
Close #132.
1 parent 49c0a68 commit 835b10c

9 files changed

Lines changed: 84 additions & 41 deletions

File tree

src/AC.pas

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,7 @@ procedure TAC.UpdateKrok();
540540

541541
// stavit JC
542542
if (OblR.stack.volba = TORStackVolba.VZ) then
543-
OblR.stack.AddJC(JC, panel, false)
543+
OblR.stack.AddJC(JC, panel, false, false)
544544
else
545545
JC.StavJC(panel, OblR);
546546

src/Zasobnik.pas

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ TORStackCmdJC = class(TORStackCmd)
2222
JC:TObject;
2323
nouz:boolean;
2424
Pnl:TIDContext;
25+
ab:boolean;
2526
end;
2627

2728
// povel k zapnuti zadosti o tratovy souhlas
@@ -85,7 +86,7 @@ TORStack = class
8586
destructor Destroy(); override;
8687

8788
procedure ParseCommand(SenderPnl:TIdContext; data:TStrings);
88-
procedure AddJC(JC:TObject; SenderPnl:TIDContext; nouz:boolean);
89+
procedure AddJC(JC:TObject; SenderPnl:TIDContext; nouz:boolean; ab:boolean);
8990
procedure AddZTS(uvazka:TObject; SenderPnl:TIDContext);
9091
procedure AddUTS(uvazka:TObject; SenderPnl:TIDContext);
9192

@@ -280,7 +281,7 @@ procedure TORStack.ORCmdUPO(SenderPnl:TIdContext);
280281

281282
if (Self.stack[0].ClassType = TORStackCmdJC) then begin
282283
cmd := (Self.stack[0] as TORSTackCmdJC);
283-
(cmd.JC as TJC).StavJC(SenderPnl, Self.OblR, Self, cmd.nouz);
284+
(cmd.JC as TJC).StavJC(SenderPnl, Self.OblR, Self, cmd.nouz, false, cmd.ab);
284285
end else if (Self.stack[0].ClassType = TORStackCmdZTS) then
285286
((Self.stack[0] as TORStackCmdZTS).uvazka as TBlkUvazka).DoZTS(SenderPnl, Self.OblR)
286287
else if (Self.stack[0].ClassType = TORStackCmdUTS) then
@@ -317,13 +318,14 @@ procedure TORStack.AddCmd(cmd:TORStackCmd);
317318
////////////////////////////////////////////////////////////////////////////////
318319

319320
// Pridani jizdni cesty do zasobniku:
320-
procedure TORStack.AddJC(JC:TObject; SenderPnl:TIDContext; nouz:boolean);
321+
procedure TORStack.AddJC(JC:TObject; SenderPnl:TIDContext; nouz:boolean; ab:boolean);
321322
var cmd:TORStackCmdJC;
322323
begin
323324
cmd := TORStackCmdJC.Create();
324-
cmd.JC := JC;
325-
cmd.Pnl := SenderPnl;
325+
cmd.JC := JC;
326+
cmd.Pnl := SenderPnl;
326327
cmd.nouz := nouz;
328+
cmd.ab := ab;
327329

328330
try
329331
Self.AddCmd(cmd);
@@ -477,7 +479,7 @@ procedure TORStack.ZpracujJC(cmd:TORStackCmdJC);
477479

478480
// pokud nejsou zadne bariery, stavime jizdni cestu
479481
(Self.OblR as TOR).BroadcastData('ZAS;FIRST;0');
480-
JC.StavJC(cmd.Pnl, Self.OblR, Self);
482+
JC.StavJC(cmd.Pnl, Self.OblR, Self, false, false, cmd.ab);
481483
Self.UPOenabled := false;
482484
bariery.Free();
483485
end;

src/bloky/TBlokNav.pas

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ TBlkNavSettings = record
4343

4444
// stav bloku Nav
4545
TBlkNavStav = record
46-
ZacatekVolba:TBlkNavVolba; // nazatek volby jidni cesty
46+
ZacatekVolba:TBlkNavVolba; // zacatek volby jidni cesty
47+
ZacatekAB:Boolean; // jestli je zacatek volby JC v rezimu AB
4748
Navest:Integer; // aktualni navest dle kodu SCom; pokud je vypla komunikace, -1
4849
cilova_navest:Integer; // navest, ktera ma byt nastavena
4950
navest_old:Integer; // behem staveni obsahuje byvalou navest
@@ -77,6 +78,7 @@ TBlkNav = class(TBlk)
7778
//defaultni stav
7879
_def_Nav_stav:TBlkNavStav = (
7980
ZacatekVolba : none;
81+
ZacatekAB : false;
8082
Navest : -1;
8183
ABJC : nil;
8284
ZAM : false;
@@ -231,6 +233,7 @@ TBlkNav = class(TBlk)
231233
//stavove promenne
232234
property Navest:Integer read NavStav.Navest write mSetNavest;
233235
property ZacatekVolba:TBlkNavVolba read NavStav.ZacatekVolba write SetZacatekVolba;
236+
property ZacatekAB:Boolean read NavStav.ZacatekAB;
234237
property AB:boolean read GetAB write SetAB;
235238
property ABJC:TJC read NavStav.ABJC write SetABJC;
236239
property ZAM:boolean read NavStav.ZAM write SetZAM;
@@ -849,7 +852,7 @@ procedure TBlkNav.SetABJC(ab:TJC);
849852
procedure TBlkNav.SetAB(ab:boolean);
850853
begin
851854
if (ab) then
852-
raise EInvalidOperation.Create('You can only disable AB via SetAB!');
855+
raise EInvalidOperation.Create('You can only enable AB via SetABJC!');
853856

854857
if (Self.AB and (not ab)) then
855858
Self.ABJC := nil;
@@ -859,6 +862,8 @@ procedure TBlkNav.SetZacatekVolba(typ:TBlkNavVolba);
859862
begin
860863
if (Self.NavStav.ZacatekVolba = typ) then Exit();
861864
Self.NavStav.ZacatekVolba := typ;
865+
if (typ = TBlkNavVolba.none) then
866+
Self.NavStav.ZacatekAB := false;
862867
Self.Change();
863868
end;
864869

@@ -911,6 +916,7 @@ procedure TBlkNav.MenuVCStartClick(SenderPnl:TIdContext; SenderOR:TObject);
911916
TOR(SenderOR).ClearVb(); // smazeme dosavadni seznam variantnich bodu
912917
end;
913918
Self.ZacatekVolba := TBlkNavVolba.VC;
919+
Self.NavStav.ZacatekAB := false;
914920
end;
915921

916922
procedure TBlkNav.MenuVCStopClick(SenderPnl:TIdContext; SenderOR:TObject);
@@ -928,6 +934,7 @@ procedure TBlkNav.MenuPCStartClick(SenderPnl:TIdContext; SenderOR:TObject);
928934
Blk := BLky.GeTBlkNavZacatekVolba((SenderOR as TOR).id);
929935
if (Blk <> nil) then (Blk as TBlkNav).ZacatekVolba := TBlkNavVolba.none;
930936
Self.ZacatekVolba := TBlkNavVolba.PC;
937+
Self.NavStav.ZacatekAB := false;
931938
end;
932939

933940
procedure TBlkNav.MenuPCStopClick(SenderPnl:TIdContext; SenderOR:TObject);
@@ -995,12 +1002,20 @@ procedure TBlkNav.MenuRCClick(SenderPnl:TIdContext; SenderOR:TObject);
9951002

9961003
procedure TBlkNav.MenuABStartClick(SenderPnl:TIdContext; SenderOR:TObject);
9971004
begin
998-
Self.ABJC := Self.DNjc;
1005+
if (Self.DNjc <> nil) then
1006+
Self.ABJC := Self.DNjc
1007+
else begin
1008+
Self.MenuVCStartClick(SenderPnl, SenderOR);
1009+
Self.NavStav.ZacatekAB := true;
1010+
end;
9991011
end;
10001012

10011013
procedure TBlkNav.MenuABStopClick(SenderPnl:TIdContext; SenderOR:TObject);
10021014
begin
1003-
Self.ABJC := nil;
1015+
if (Self.ABJC <> nil) then
1016+
Self.ABJC := nil
1017+
else
1018+
Self.MenuVCStopClick(SenderPnl, SenderOR);
10041019
end;
10051020

10061021
procedure TBlkNav.MenuLockClick(SenderPnl:TIdContext; SenderOR:TObject);
@@ -1179,12 +1194,16 @@ function TBlkNav.ShowPanelMenu(SenderPnl:TIdContext; SenderOR:TObject; rights:TO
11791194
if (Self.NavSettings.zamknuto) then Exit();
11801195

11811196
if (((((Self.DNjc = nil) or (Self.DNjc.RozpadRuseniBlok >= 1)) and
1182-
(JCDb.FindOnlyStaveniJC(Self.id) = -1) and (Self.Navest <> 8) and (not Self.AB))
1197+
(JCDb.FindOnlyStaveniJC(Self.id) = -1) and (Self.Navest <> _NAV_PRIVOL) and (not Self.AB))
11831198
or ((SenderOR as TOR).stack.volba = VZ)) and
11841199
(not Self.autoblok)) then
11851200
begin
11861201
case (Self.NavStav.ZacatekVolba) of
1187-
TBlkNavVolba.VC : Result := Result + 'VC<,';
1202+
TBlkNavVolba.VC :
1203+
if (Self.ZacatekAB) then
1204+
Result := Result + 'AB<,'
1205+
else
1206+
Result := Result + 'VC<,';
11881207
TBlkNavVolba.PC : Result := Result + 'PC<,';
11891208
TBlkNavVolba.NC : Result := Result + 'PN<,';
11901209
TBlkNavVolba.PP : Result := Result + 'PP<,';
@@ -1193,7 +1212,11 @@ function TBlkNav.ShowPanelMenu(SenderPnl:TIdContext; SenderOR:TObject; rights:TO
11931212
if (Self.NavRel.SymbolType = TBlkNavSymbol.hlavni) then
11941213
begin
11951214
if ((JCDb.IsAnyVCAvailable(Self)) or ((SenderOR as TOR).stack.volba = VZ)) then // i kdyz neni zadna VC, schvalne umoznime PN
1215+
begin
11961216
Result := Result + 'VC>,';
1217+
if (Self.DNjc = nil) then
1218+
Result := Result + 'AB>,';
1219+
end;
11971220
Result := Result + '!PN>,';
11981221
end;
11991222
if (JCDb.IsAnyPC(Self)) then
@@ -1207,20 +1230,20 @@ function TBlkNav.ShowPanelMenu(SenderPnl:TIdContext; SenderOR:TObject; rights:TO
12071230
Result := Result + '-,';
12081231
end;
12091232

1210-
if ((Self.Navest > 0) and (not Self.autoblok)) then
1233+
if ((Self.Navest > _NAV_STUJ) and (not Self.autoblok)) then
12111234
Result := Result + 'STUJ,';
12121235

1213-
if (Self.Navest = 8) then
1236+
if (Self.Navest = _NAV_PRIVOL) then
12141237
Result := Result + '!PPN,';
12151238

12161239
if (Self.DNjc <> nil) then
12171240
begin
12181241
// bud je cesta primo postavena, nebo je zrusena, ale podminky jsou vyhovujici pro DN
12191242
// plati jen pro postavenou JC
1220-
if ((not Self.ZAM) and (Self.Navest = 0) and (Self.DNjc.CanDN())) then
1243+
if ((not Self.ZAM) and (Self.Navest = _NAV_STUJ) and (Self.DNjc.CanDN())) then
12211244
Result := Result + 'DN,';
12221245

1223-
if (((Self.Navest > 0) or (Self.DNjc.CanDN()) or (Self.DNjc.RozpadBlok < 1))
1246+
if (((Self.Navest > _NAV_STUJ) or (Self.DNjc.CanDN()) or (Self.DNjc.RozpadBlok < 1))
12241247
and (not Self.RCinProgress())) then
12251248
begin
12261249
Result := Result + 'RC,';
@@ -1235,13 +1258,12 @@ function TBlkNav.ShowPanelMenu(SenderPnl:TIdContext; SenderOR:TObject; rights:TO
12351258
if (Self.AB) then
12361259
Result := Result + 'AB<,';
12371260

1238-
//7=ZAM
12391261
if (Self.NavStav.ZAM) then
12401262
Result := Result + 'ZAM<,'
1241-
else
1263+
else
12421264
Result := Result + 'ZAM>,';
12431265

1244-
if ((Self.Navest <> 8) and (Self.CanIDoRNZ)) then
1266+
if ((Self.Navest <> _NAV_PRIVOL) and (Self.CanIDoRNZ)) then
12451267
Result := Result + '!RNZ,';
12461268

12471269
// DEBUG: jednoduche nastaveni IR pri knihovne simulator

src/bloky/TBlokUsek.pas

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,7 +1070,7 @@ procedure TBlkUsek.MenuVylClick(SenderPnl:TIdContext; SenderOR:TObject);
10701070

10711071
// pokud volba nebyla uspesna, vraci false a v tom pripade je vyvolano menu
10721072
function TBlkUsek.MenuKCClick(SenderPnl:TIdContext; SenderOR:TObject):boolean;
1073-
var Blk:TBlk;
1073+
var nav:TBlkNav;
10741074
begin
10751075
if ((Self.UsekStav.KonecJC <> TZaver.no) and (not (SenderOR as TOR).vb.Contains(Self))) then
10761076
begin
@@ -1080,17 +1080,17 @@ function TBlkUsek.MenuKCClick(SenderPnl:TIdContext; SenderOR:TObject):boolean;
10801080

10811081
if ((SenderOR as TOR).vb.Contains(Self)) then (SenderOR as TOR).vb.Remove(self);
10821082

1083-
Blk := Blky.GetBlkNavZacatekVolba((SenderOR as TOR).id);
1084-
if (Blk = nil) then Exit(false);
1083+
nav := Blky.GetBlkNavZacatekVolba((SenderOR as TOR).id) as TBlkNav;
1084+
if (nav = nil) then Exit(false);
10851085

1086-
case ((Blk as TBlkNav).ZacatekVolba) of
1086+
case (nav.ZacatekVolba) of
10871087
TBlkNavVolba.VC : Self.UsekStav.KonecJC := TZaver.vlak;
10881088
TBlkNavVolba.PC : Self.UsekStav.KonecJC := TZaver.posun;
10891089
TBlkNavVolba.NC, TBlkNavVolba.PP
10901090
: Self.UsekStav.KonecJC := TZaver.nouz;
10911091
end;//case
10921092

1093-
JCDb.StavJC(Blk, Self, SenderPnl, SenderOR);
1093+
JCDb.StavJC(nav, Self, SenderPnl, SenderOR, nav.ZacatekAB);
10941094

10951095
Self.Change();
10961096
Result := true;

src/bloky/TBloky.pas

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,7 @@ function TBlky.GetBlkNavZacatekVolba(obl:string):TBlk;
598598

599599
if (orindex = -1) then continue;
600600

601-
if ((Integer((Self.Data[i] as TBlkNav).ZacatekVolba) > 0) and
601+
if (((Self.Data[i] as TBlkNav).ZacatekVolba > TBlkNavVolba.none) and
602602
((JCDb.FindOnlyStaveniJC((Self.Data[i] as TBlkNav).id) = -1) or
603603
((Self.Data[i] as TBlkNav).OblsRizeni[orindex].stack.volba = VZ))) then
604604
Exit(Self.Data[i]);

src/jc/TJCDatabase.pas

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ TJCDb = class
3737
procedure UpdateJCIndexes();
3838

3939
procedure Update();
40-
procedure StavJC(StartBlk,EndBlk:TBlk; SenderPnl:TIdContext; SenderOR:TObject);
40+
procedure StavJC(StartBlk,EndBlk:TBlk; SenderPnl:TIdContext; SenderOR:TObject; abAfter: Boolean);
4141

4242
function AddJC(JCdata:TJCprop):TJC;
4343
procedure RemoveJC(index:Integer);
@@ -264,7 +264,7 @@ function TJCDb.FindJC(startNav:TBlkNav; vb: TList<TObject>; endBlk:TBlk):TJC;
264264
////////////////////////////////////////////////////////////////////////////////
265265

266266
//toto se vola zvnejsi, kdyz chceme postavit jakoukoliv JC
267-
procedure TJCDb.StavJC(StartBlk,EndBlk:TBlk; SenderPnl:TIdContext; SenderOR:TObject);
267+
procedure TJCDb.StavJC(StartBlk,EndBlk:TBlk; SenderPnl:TIdContext; SenderOR:TObject; abAfter: Boolean);
268268
var oblr:TOR;
269269
startNav:TBlkNav;
270270
senderOblr:TOR;
@@ -284,21 +284,33 @@ procedure TJCDb.StavJC(StartBlk,EndBlk:TBlk; SenderPnl:TIdContext; SenderOR:TObj
284284

285285
if (SenderOblr.stack.volba = TORStackVolba.VZ) then
286286
begin
287-
SenderOblr.stack.AddJC(jc, SenderPnl, (startNav.ZacatekVolba = TBlkNavVolba.NC) or (startNav.ZacatekVolba = TBlkNavVolba.PP));
287+
SenderOblr.stack.AddJC(
288+
jc,
289+
SenderPnl,
290+
(startNav.ZacatekVolba = TBlkNavVolba.NC) or (startNav.ZacatekVolba = TBlkNavVolba.PP),
291+
abAfter
292+
);
288293

289294
// zrusime zacatek, konec a variantni body
290295
startNav.ZacatekVolba := TBlkNavVOlba.none;
291296
(EndBlk as TBlkUsek).KonecJC := TZaver.no;
292297
SenderOblr.ClearVb();
293298
end else begin
294299
SenderOblr.vb.Clear(); // variantni body aktualne stavene JC jen smazeme z databaze (zrusime je na konci staveni JC)
295-
jc.StavJC(SenderPnl, SenderOR, nil, (startNav.ZacatekVolba = TBlkNavVolba.NC) or (startNav.ZacatekVolba = TBlkNavVolba.PP));
300+
jc.StavJC(
301+
SenderPnl,
302+
SenderOR,
303+
nil,
304+
(startNav.ZacatekVolba = TBlkNavVolba.NC) or (startNav.ZacatekVolba = TBlkNavVolba.PP),
305+
false,
306+
abAfter
307+
);
296308
end;
297309
end else begin
298310

299311
// kontrola staveni slozene jizdni cesty
300312
if ((startNav.ZacatekVolba = TBlkNavVolba.VC) or (startNav.ZacatekVolba = TBlkNavVolba.PC)) then
301-
if (MultiJCDb.StavJC(StartBlk, EndBlk, SenderPnl, SenderOR)) then Exit();
313+
if (MultiJCDb.StavJC(StartBlk, EndBlk, SenderPnl, SenderOR, abAfter)) then Exit();
302314

303315
(EndBlk as TBlkUsek).KonecJC := TZaver.no;
304316
ORTCPServer.SendInfoMsg(SenderPnl, 'Cesta nenalezena v závěrové tabulce');

src/jc/TMultiJCDatabase.pas

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ TMultiJCDb = class
3737
function GetJCByID(id:Integer):TMultiJC;
3838
function GetJCIndexByID(id:Integer):Integer;
3939

40-
function StavJC(StartBlk,EndBlk:TBlk; SenderPnl:TIdContext; SenderOR:TObject):boolean; // vraci true, pokud nasel prislusnou cestu
40+
function StavJC(StartBlk,EndBlk:TBlk; SenderPnl:TIdContext; SenderOR:TObject; abAfter:Boolean):boolean;
4141
function FindMJC(startNav:TBlkNav; vb: TList<TObject>; endBlk:TBlk):TMultiJC;
4242
function IsAnyMJCWithPrefix(startNav:TBlkNav; vb: TList<TObject>):Boolean;
4343

@@ -256,7 +256,7 @@ function TMultiJCDb.FindMJC(startNav:TBlkNav; vb: TList<TObject>; endBlk:TBlk):T
256256

257257
////////////////////////////////////////////////////////////////////////////////
258258

259-
function TMultiJCDb.StavJC(StartBlk,EndBlk:TBlk; SenderPnl:TIdContext; SenderOR:TObject):boolean;
259+
function TMultiJCDb.StavJC(StartBlk,EndBlk:TBlk; SenderPnl:TIdContext; SenderOR:TObject; abAfter:Boolean):boolean;
260260
var mJC: TMultiJC;
261261
j: Integer;
262262
begin
@@ -269,7 +269,7 @@ function TMultiJCDb.StavJC(StartBlk,EndBlk:TBlk; SenderPnl:TIdContext; SenderOR:
269269
begin
270270
// VZ -> pridame do zasobniku postupne vsechny jizdni cesty
271271
for j := 0 to mJC.data.JCs.Count-1 do
272-
(SenderOR as TOR).stack.AddJC(JCDb.GetJCByID(mJC.data.JCs[j]), SenderPnl, false);
272+
(SenderOR as TOR).stack.AddJC(JCDb.GetJCByID(mJC.data.JCs[j]), SenderPnl, false, abAfter);
273273

274274
(StartBlk as TBlkNav).ZacatekVolba := TBlkNavVOlba.none;
275275
(EndBlk as TBlkUsek).KonecJC := TZaver.no;

0 commit comments

Comments
 (0)