Wiki source code of Basic design

Version 11.1 by sna on 2014/08/06 03:48

Show last authors
1
2
3 {{toc/}}
4
5 We compose our railway controller from several train controllers, combined with controllers for mutual exclusion.
6
7 == Mutual Exclusion ==
8
9 === Normal segments ===
10
11 **For each block** we generate one mutex controller, similar to the following pattern.
12
13 [[image:attach:Mutex.png]]
14
15 **For each controlled train** one state and the corresponding transitions are added.
16
17 A train **must** signal the wish to enter a segment by setting the variable **bool <segment>_req[trainNum] **to true.
18 The right to enter a segement is given to the train by setting the variable **int <segment>_perm** to the train number.
19 After leaving a segment the train **must** remove its request by setting <segment>_req[trainNum] to false again.
20
21 For a free track the *_perm variable is set to -1 and all tracks, apart from starting positions, are initialized with -1. For the starting positions the *_perm variables are set to the corresponding train number and the *_req variable for the train is set to true.
22
23 **A train must not enter a segment or alter the settings of a segment without holding the lock for the segment. No exceptions from this rule are allowed.**
24
25 === Kicking Horse Pass ===
26
27 To prevent collisions on the track, a special controller manages the rights to enter or leave the Kicking Horse Pass.
28
29 [[image:attach:Mutex_KH.png]]
30
31 The controller splits the pass into two parts, //left// and //right//, corresponding to the track layout chart. [[(Simplified track layout)>>url:http://www.informatik.uni-kiel.de/~~railway/Downloads/kscheme.pdf||shape="rect"]]
32
33 Each part has two operational modes, //in// and //out//, being active when trains are allowed to either enter or leave the pass. When entering the pass the controller counts the entering trains and only lets two trains enter (one after the other). When leaving the pass the trains are removed from the counter, freeing space for the next train.
34
35 == Train controller ==
36
37 Each train controller is set in a separate region with a referenced state. This state has the following interface
38
39
40 \\\\\\\\
41
42 {{{    input int *_perm;         # All permission variables (Tracks) input bool *_perm # KH permission variables   input int trainNum;    input bool cleanup; input bool debug; output bool *_req[]; # All request variables}}}
43
44 The train controller is composed of several //Station-2-Station// controllers. These are combined to form a complete schedule. Additionally the cleanup signal has to be watched to abort the schedule and return back to the initial position.
45
46 == Station-2-Station controller ==
47
48 Each station-2-station controller realizes the movement from one of the stations (IC,OC,KH) to a second station. All controllers using IC or OC parts have to respect the traveling directions. For the Kicking Horse Pass two separate controllers, forwards and backwards, are used.
49
50 The controllers starting from Kicking Horse Pass Station make an assumption of the direction of the train. These are dependent of the directions of the inner or outer circle, e.g. the KHIC controller starts backwards because this is the only valid direction to travel this path. To drive a train from the Kicking Horse Station (facing forward) to the Inner Circle we have to combine the KHOC and OCIC controllers.
51
52 [[image:attach:ICIC.png]]
53
54 When arriving on a station the train controller **must** first call the function //void railArrival(int train, int station)//. This starts the waiting timer for the train.
55 Next the train **must** wait for// int railDeparture(int train)// to return 1.
56 After the waiting has finished the controller can reach a final state and pass the control back to the train controller.
57
58 === Structure ===
59
60 ----
61
62
63
64
65 |=(((
66 {{{input int *_perm;}}}
67
68 {{{output bool *_req[11];}}}
69
70 {{{input int trainNum;}}}
71
72 {{{input int depTrack;}}}
73
74 {{{input int destTrack;}}}
75
76 {{{input bool cleanup;}}}
77
78 {{{input bool debug;}}}
79
80 {{{output int arrTrack;}}}
81
82 {{{int i_arrOnTrack;}}}
83
84 {{{ }}}
85
86 {{{initial state *_ST {}}}
87
88 {{{    entry debug / 'println([trainNum][ST-ST] ... )';}}}
89
90 {{{ }}}
91
92 {{{    initial state waitForPerm {}}}
93
94 {{{        entry / *_ST_4_req[trainNum] = true;}}}
95
96 {{{        entry / *_LN_0_req[trainNum] = true;}}}
97
98 {{{    }}}}
99
100 {{{    --&#x3e; gotPerm with (*_ST_4_perm == trainNum) &#x26; (*_LN_0_perm == trainNum)}}}
101
102 {{{    --&#x3e; backOff with (*_ST_4_perm == trainNum) | (*_LN_0_perm == trainNum);}}}
103
104 {{{ }}}
105
106 {{{    state backOff}}}
107
108 {{{    --&#x3e; backOff1;}}}
109
110 {{{ }}}
111
112 {{{    state backOff1 {}}}
113
114 {{{entry / *_ST_4_req[trainNum] = false;}}}
115
116 {{{entry / *_LN_0_req[trainNum] = false;}}}
117
118 {{{    }}}}
119
120 {{{    --&#x3e; waitForPerm;}}}
121
122 {{{ }}}
123
124 {{{final state gotPerm;}}}
125
126 {{{}}}}
127
128 {{{&#x3e;-&#x3e; Dep_*_ST;}}}
129
130 {{{ }}}
131
132 {{{state Dep_IC_ST {}}}
133
134 {{{    entry / 'railPoint(*,STRAIGHT)';}}}
135
136 {{{    entry / 'railSignal(*_LN_0, FWD, RED)';}}}
137
138 {{{    entry / 'railTrack(*_LN_0,FWD,trainNum,NORMAL)';}}}
139
140 {{{    entry / 'railTrack(*_ST_4,FWD,trainNum,NORMAL)';}}}
141
142 {{{    entry depTrack == 1 / 'railSignal(*_ST_1, FWD, GREEN)';}}}
143
144 {{{    entry depTrack == 2 / 'railSignal(*_ST_2, FWD, GREEN)';}}}
145
146 {{{    entry depTrack == 3 / 'railSignal(*_ST_3, FWD, GREEN)';}}}
147
148 {{{    ..........}}}
149
150 {{{  } --&#x3e; *_LN_0 with 'railContact(*_LN_0,0)';}}}
151
152 {{{ }}}
153
154 {{{  state *_LN_0 {}}}
155
156 {{{    entry / 'println("[trainNum][ST-ST] Entering *_LN_0")';}}}
157
158 {{{    entry debug / 'println("[trainNum][ST-ST] Requesting permission for *_LN_1")';}}}
159
160 {{{    entry depTrack == 1 / 'railSignal(*_ST_1, FWD, RED)';}}}
161
162 {{{    entry depTrack == 2 / 'railSignal(*_ST_2, FWD, RED)';}}}
163
164 {{{    entry depTrack == 3 / 'railSignal(*_ST_3, FWD, RED)';}}}
165
166 {{{    entry / *_LN_1_req[trainNum] = true;}}}
167
168 {{{ }}}
169
170 {{{    region Travel:}}}
171
172 {{{      initial state Entry}}}
173
174 {{{      --&#x3e; Continue with 'railContact(*_LN_0,0)' &#x26; (*_LN_1_perm == trainNum)}}}
175
176 {{{      --&#x3e; Slowdown with 'railContact(*_LN_0,0)';}}}
177
178 {{{ }}}
179
180 {{{      state Slowdown {}}}
181
182 {{{        entry debug / 'println("[trainNum][ST-ST] Slowing down on *_LN_0")';}}}
183
184 {{{        entry / 'railTrack(*_LN_0,FWD,trainNum,CAUTION)';}}}
185
186 {{{      }}}}
187
188 {{{      --&#x3e; Waiting with 'railContact(*_LN_0,1)'}}}
189
190 {{{      --&#x3e; Continue with *_LN_1_perm == trainNum;}}}
191
192 {{{ }}}
193
194 {{{      state Waiting {}}}
195
196 {{{        entry debug / 'println("[trainNum][ST-ST] Stopping on *_LN_0")';}}}
197
198 {{{        entry / 'railTrackBrake(*_LN_0)';}}}
199
200 {{{      }}}}
201
202 {{{      --&#x3e; Continue with *_LN_1_perm == trainNum;}}}
203
204 {{{ }}}
205
206 {{{      final state Continue {}}}
207
208 {{{        entry debug / 'println("[trainNum][ST-ST] Continuing on *_LN_0")';}}}
209
210 {{{        entry / 'railSignal(*_LN_0,FWD,GREEN)';}}}
211
212 {{{        entry / 'railTrack(*_LN_0,FWD,trainNum,NORMAL)';}}}
213
214 {{{        entry / 'railTrack(*_LN_1,FWD,trainNum,NORMAL)';}}}
215
216 {{{        entry / 'railSignal(*_LN_1, FWD, RED)';}}}
217
218 {{{      };}}}
219
220 {{{ }}}
221
222 {{{    region Cleanup:}}}
223
224 {{{      initial state Entry}}}
225
226 {{{      --&#x3e; cleanup with 'railContact(*_LN_0,0)';}}}
227
228 {{{ }}}
229
230 {{{      final state cleanup {}}}
231
232 {{{      entry debug / 'println("[trainNum][ST-ST] Entered *_LN_0 completely")';}}}
233
234 {{{      entry / 'railTrackOff(*_ST_4)';}}}
235
236 {{{      entry / *_ST_4_req[trainNum] = false;}}}
237
238 {{{      };}}}
239
240 {{{  }&#x3e;-&#x3e; *_LN_0_*_LN_1;}}}
241
242 {{{ }}}
243
244 {{{  state IC_LN_0_IC_LN_1}}}
245
246 {{{  --&#x3e; IC_LN_1 with 'railContact(IC_LN_1,0)';}}}
247
248 {{{ }}}
249
250 {{{// ...................}}}
251
252 {{{// Set of track segment controlling states such as before}}}
253
254 {{{// ...................}}}
255
256 {{{ }}}
257
258 {{{state *_LN_5 {}}}
259
260 {{{    int perm_all_next_segments = false;}}}
261
262 {{{    entry / 'println("[trainNum][ST-ST] Entering *_LN_5")';}}}
263
264 {{{    entry / 'railSignal(*_LN_4, FWD, RED)';}}}
265
266 {{{ }}}
267
268 {{{    region Travel:}}}
269
270 {{{      initial state Entry}}}
271
272 {{{      --&#x3e; Continue with 'railContact(*_LN_5,0)' &#x26; perm_all_next_segments}}}
273
274 {{{      --&#x3e; Slowdown with 'railContact(*_LN_5,0)';}}}
275
276 {{{ }}}
277
278 {{{      state Slowdown {}}}
279
280 {{{        entry debug / 'println("[trainNum][ST-ST] Slowing down on *_LN_5")';}}}
281
282 {{{        entry / 'railTrack(*_LN_5,FWD,trainNum,CAUTION)';}}}
283
284 {{{      }}}}
285
286 {{{      --&#x3e; Waiting with 'railContact(*_LN_5,1)'}}}
287
288 {{{      --&#x3e; Continue with perm_all_next_segments;}}}
289
290 {{{ }}}
291
292 {{{      state Waiting {}}}
293
294 {{{        entry debug / 'println("[trainNum][ST-ST] Stopping on *_LN_5")';}}}
295
296 {{{        entry / 'railTrackBrake(*_LN_5)';}}}
297
298 {{{      }}}}
299
300 {{{      --&#x3e; Continue with perm_all_next_segments;}}}
301
302 {{{ }}}
303
304 {{{      final state Continue {}}}
305
306 {{{        entry debug / 'println("[trainNum][ST-ST] Continuing on *_LN_5")';        }}}
307
308 {{{        entry i_arrOnTrack == 1 / 'railTrack(*_ST_1,FWD,trainNum,NORMAL)';}}}
309
310 {{{        entry i_arrOnTrack == 2 / 'railTrack(*_ST_2,FWD,trainNum,NORMAL)';}}}
311
312 {{{        entry i_arrOnTrack == 3 / 'railTrack(*_ST_3,FWD,trainNum,NORMAL)';}}}
313
314 {{{        ----------}}}
315
316 {{{        entry / arrTrack = i_arrOnTrack;}}}
317
318 {{{      };}}}
319
320 {{{ }}}
321
322 {{{    region Cleanup:}}}
323
324 {{{      initial state Entry}}}
325
326 {{{      --&#x3e; cleanup with 'railContact(*_LN_5,0)';}}}
327
328 {{{ }}}
329
330 {{{      final state cleanup {}}}
331
332 {{{        entry debug / 'println("[trainNum][ST-ST] Entered *_LN_5 completely")';}}}
333
334 {{{        entry / 'railTrackOff(*_LN_4)';}}}
335
336 {{{        entry / *_LN_4_req[trainNum] = false;}}}
337
338 {{{      };}}}
339
340 {{{ }}}
341
342 {{{    region Permissions:}}}
343
344 {{{      initial state checking {}}}
345
346 {{{        entry / *_ST_0_req[trainNum] = true;}}}
347
348 {{{        entry destTrack == 1 | !cleanup / *_ST_1_req[trainNum] = true;}}}
349
350 {{{        entry destTrack == 2 | !cleanup / *_ST_2_req[trainNum] = true;}}}
351
352 {{{        entry destTrack == 3 | !cleanup / *_ST_3_req[trainNum] = true;}}}
353
354 {{{      }}}}
355
356 \\
357
358 {{{      --&#x3e; success with destTrack == 1 &#x26; *_ST_0_perm == trainNum &#x26; *_ST_1_perm == trainNum / i_arrOnTrack = 1}}}
359
360 \\
361
362 {{{      --&#x3e; success with destTrack == 2 &#x26; *_ST_0_perm == trainNum &#x26; *_ST_2_perm == trainNum / i_arrOnTrack = 2}}}
363
364 \\
365
366 {{{      --&#x3e; success with destTrack == 3 &#x26; *_ST_0_perm == trainNum &#x26; *_ST_3_perm == trainNum / i_arrOnTrack = 3}}}
367
368 {{{      --&#x3e; success with *_ST_0_perm == trainNum &#x26; *_ST_1_perm == trainNum / i_arrOnTrack = 1}}}
369
370 {{{      --&#x3e; success with *_ST_0_perm == trainNum &#x26; *_ST_2_perm == trainNum / i_arrOnTrack = 2}}}
371
372 {{{      --&#x3e; success with *_ST_0_perm == trainNum &#x26; *_ST_3_perm == trainNum / i_arrOnTrack = 3}}}
373
374
375 \\
376
377 {{{      --&#x3e; resolving with *_ST_0_perm == trainNum | *_ST_3_perm == trainNum | *_ST_2_perm == trainNum | *_ST_1_perm == trainNum;}}}
378
379 {{{ }}}
380
381 {{{      state resolving}}}
382
383 {{{      --&#x3e; resolving1;}}}
384
385 {{{ }}}
386
387 {{{      state resolving1 {}}}
388
389 {{{        entry / *_ST_0_req[trainNum] = false;}}}
390
391 {{{        entry / *_ST_1_req[trainNum] = false;}}}
392
393 {{{        entry / *_ST_2_req[trainNum] = false;}}}
394
395 {{{        entry / *_ST_3_req[trainNum] = false;}}}
396
397 {{{      }}}}
398
399 {{{      --&#x3e; checking;}}}
400
401 {{{ }}}
402
403 {{{      state success}}}
404
405 {{{      --&#x3e; success1;}}}
406
407 {{{ }}}
408
409 {{{      final state success1 {}}}
410
411 {{{        entry !(i_arrOnTrack == 1) / *_ST_1_req[trainNum] = false;      }}}
412
413 {{{        entry !(i_arrOnTrack == 2) / *_ST_2_req[trainNum] = false;}}}
414
415 {{{        entry !(i_arrOnTrack == 3) / *_ST_3_req[trainNum] = false;}}}
416
417 {{{        entry / perm_all_next_segments = true;}}}
418
419 {{{      };}}}
420
421 {{{  }&#x3e;-&#x3e; *_LN_5_*_ST;}}}
422
423 {{{ }}}
424
425 {{{  state *_LN_5_*_ST}}}
426
427 {{{  --&#x3e; Arr_*_ST with i_arrOnTrack == 1 &#x26; 'railContact(*_ST_1,0)'}}}
428
429 {{{  --&#x3e; Arr_*_ST with i_arrOnTrack == 2 &#x26; 'railContact(*_ST_2,0)'}}}
430
431 {{{  --&#x3e; Arr_*_ST with i_arrOnTrack == 3 &#x26; 'railContact(*_ST_3,0)';}}}
432
433 {{{ }}}
434
435 {{{  state Arr_*_ST {}}}
436
437 {{{    entry / 'railSignal(*_LN_5, FWD, RED)';}}}
438
439 {{{    entry / 'railTrackOff(*C_LN_5)';}}}
440
441 {{{    entry / 'railTrack(*_ST_0,FWD,trainNum,SLOW)';}}}
442
443 {{{    entry i_arrOnTrack == 1 / 'railTrack(*_ST_1,FWD,trainNum,SLOW)';}}}
444
445 {{{    entry i_arrOnTrack == 2 / 'railTrack(*_ST_2,FWD,trainNum,SLOW)';}}}
446
447 {{{    entry i_arrOnTrack == 3 / 'railTrack(*_ST_3,FWD,trainNum,SLOW)';}}}
448
449 {{{    entry / *_LN_5_req[trainNum] = false;}}}
450
451 {{{ }}}
452
453 {{{    initial state SlowEntry}}}
454
455 {{{    --&#x3e; Slow with i_arrOnTrack == 1 &#x26; 'railContact(*_ST_1,0)'}}}
456
457 {{{    --&#x3e; Slow with i_arrOnTrack == 2 &#x26; 'railContact(*_ST_2,0)'}}}
458
459 {{{    --&#x3e; Slow with i_arrOnTrack == 3 &#x26; 'railContact(*_ST_3,0)';}}}
460
461 {{{ }}}
462
463 {{{    state Slow {}}}
464
465 {{{      entry / 'railTrackOff(*_ST_0)';}}}
466
467 {{{      entry / *_ST_0_req[trainNum] = false;}}}
468
469 {{{    }}}}
470
471 {{{    --&#x3e; Halt with i_arrOnTrack == 1 &#x26; 'railContact(*_ST_1,1)'}}}
472
473 {{{    --&#x3e; Halt with i_arrOnTrack == 2 &#x26; 'railContact(*_ST_2,1)'}}}
474
475 {{{    --&#x3e; Halt with i_arrOnTrack == 3 &#x26; 'railContact(*_ST_3,1)';}}}
476
477 {{{ }}}
478
479 {{{    final state Halt {}}}
480
481 {{{      entry i_arrOnTrack == 1 / 'railTrackBrake(*_ST_1)';}}}
482
483 {{{      entry i_arrOnTrack == 2 / 'railTrackBrake(*_ST_2)';}}}
484
485 {{{      entry i_arrOnTrack == 3 / 'railTrackBrake(*_ST_3)';}}}
486
487 {{{      entry i_arrOnTrack == 1 / 'railArrival(trainNum, *_ST_1)';}}}
488
489 {{{      entry i_arrOnTrack == 2 / 'railArrival(trainNum, *_ST_2)';}}}
490
491 {{{      entry i_arrOnTrack == 3 / 'railArrival(trainNum, *_ST_3)';}}}
492
493 {{{    };}}}
494
495 {{{  }}}}
496
497 {{{  &#x3e;-&#x3e; done;}}}
498
499 {{{ }}}
500
501 {{{  state done}}}
502
503 {{{  --&#x3e; reallyDone with 'railDeparture(trainNum)';}}}
504
505 {{{ }}}
506
507 {{{  final state reallyDone;}}}
508 )))|=(((
509 ~/~/ All permissiions variables
510
511 ~/~/ All request variables
512
513 ~/~/ Train number
514
515 ~/~/ Departure track number
516
517 ~/~/ Destination track number
518
519 ~/~/ Cleanup flag for selecting the track of destination
520
521 ~/~/ Debug flag for additional output
522
523 ~/~/ Arrival track
524
525 ~/~/ Variable (arrival track) for selecting correct station elements
526
527
528
529 ~/~/ Handles departing from a station
530
531 ~/~/ Additional output for debugging
532
533
534
535 ~/~/ State, which set requests for needed tracks
536
537
538
539
540
541
542
543 ~/~/ Transition for received **all** needed permissions
544
545 ~/~/ Tranisition for received **some** needed permissions
546
547
548
549 ~/~/ State for waiting an additional Tick
550
551
552
553
554
555 ~/~/ State, which releases the requests for needed tracks
556
557
558
559
560
561
562
563 ~/~/ Transition to trying the requesting again
564
565
566
567
568
569
570
571 ~/~/ Transition to the departure state
572
573
574
575 ~/~/ State, which handles the train departure
576
577 ~/~/ Set of entry-Actions to set tracks, points and signals according to depTrack
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592 ~/~/ Transition to next track segment, if contact is readed
593
594
595
596 ~/~/ State for handling the train on track *_LN_0
597
598 ~/~/ Outputs for debugging
599
600
601
602 ~/~/ Entry-Actions to set the previous signals to RED
603
604
605
606
607
608 ~/~/ Requesting the next segment
609
610
611
612 ~/~/ Region for handling train driving
613
614
615
616 ~/~/ Transition to continuing state, if permitted
617
618 ~/~/ Transition to slowing down else
619
620
621
622 ~/~/ State for slowing down
623
624 ~/~/ Addtitional output for debugging
625
626 ~/~/ Entry-Action for slowing down the train
627
628
629
630 ~/~/ Transition to waiting state
631
632 ~/~/ Transition to continuing state, if permitted
633
634
635
636 ~/~/ Waiting state
637
638 ~/~/ Addtitional output for debugging
639
640 ~/~/ Entry-Action for stopping the train
641
642
643
644 ~/~/ Tranisition to continuing state
645
646
647
648 ~/~/ State to continuing driving on the track
649
650 ~/~/ Addtitional output for debugging
651
652 ~/~/ Entry-Actions to set tracks and signals for driving
653
654
655
656
657
658
659
660
661
662
663
664 ~/~/ Region for handling cleanup-functionalities
665
666
667
668 ~/~/ Transition to cleanup state
669
670
671
672 ~/~/ Cleanup state
673
674 ~/~/ Addtitional output for debugging
675
676 ~/~/ Entry-Action to switching off the previous track
677
678 ~/~/ Entry-Action to release the previous track
679
680
681
682 ~/~/ Transition to transitional state
683
684
685
686 ~/~/ Transitional state
687
688 ~/~/ Transition to next track segment, if contact is readed
689
690
691
692
693
694
695
696
697
698
699
700 ~/~/ State for entering a station
701
702 ~/~/ Variable for checking all needed permissions
703
704 ~/~/ Output
705
706 ~/~/ Setting signal to RED
707
708
709
710 ~/~/ Region for handling train driving
711
712
713
714 ~/~/ Transition to continuing state, if permitted
715
716 ~/~/ Transition to slowing down else
717
718
719
720 ~/~/ State for slowing down
721
722 ~/~/ Addtitional output for debugging
723
724 ~/~/ Entry-Action for slowing down the train
725
726
727
728 ~/~/ Transition to waiting state
729
730 ~/~/ Transition to continuing state, if permitted
731
732
733
734 ~/~/ Waiting state
735
736 ~/~/ Addtitional output for debugging
737
738 ~/~/ Entry-Action for stopping the train
739
740
741
742 ~/~/ Tranisition to continuing state
743
744
745
746 ~/~/ State to continuing driving on the track
747
748 ~/~/ Addtitional output for debugging
749
750 ~/~/ Set of entry-Actions for setting tracks, points and signals according to i_arrOnTrack
751
752
753
754
755
756
757
758 ~/~/ Setting the arrival track (output)
759
760
761
762
763
764 ~/~/ Region for handling cleanup-functionalities
765
766
767
768 ~/~/ Transition to cleanup state
769
770
771
772 ~/~/ Cleanup state
773
774 ~/~/ Addtitional output for debugging
775
776 ~/~/ Entry-Action to switching off the previous tracks
777
778 ~/~/ Entry-Action to release the previous tracks
779
780
781
782
783
784 ~/~/ Region for handling permissions of all needed tracks
785
786 ~/~/ State for requesting all needed tracks according to destination track and cleanup-Flag
787
788
789
790
791
792
793
794
795
796
797
798 ~/~/ Transitions for permitted tracks match wished tracks
799
800
801
802
803
804 ~/~/ Transitions for permitted tracks don't match wished tracks
805
806
807
808
809
810 ~/~/ Transition for not all tracks permitted
811
812
813
814 ~/~/ State for waiting an additional tick
815
816
817
818
819
820 ~/~/ State for releasing track requests
821
822
823
824
825
826
827
828
829
830
831
832 ~/~/ Transition for trying the requesting again
833
834
835
836 ~/~/ State for waiting an additional tick
837
838
839
840
841
842 ~/~/ State for releasing not used track requests and
843
844
845
846
847
848
849
850 ~/~/ Settting perm_all_next_segments to true
851
852
853
854 ~/~/ Transition to station entry states
855
856
857
858 ~/~/ State waiting for station entry
859
860
861
862
863
864
865
866
867
868 ~/~/ State for setting tracks, points and signals according to i_arrOnTrack
869
870 ~/~/ and releasing previous track request
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886 ~/~/ State for slowing down, if train completely on track
887
888
889
890
891
892
893
894
895
896 ~/~/ State for switching off previous track and releasing the request
897
898
899
900
901
902
903
904 ~/~/ Transitions to halt states, if train at second contact of a track
905
906
907
908
909
910
911
912
913
914 ~/~/ Entry-Actions for braking the train on correct track
915
916
917
918
919
920 ~/~/ Entry-Actions for waiting for timer on correct track
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936 ~/~/ Transition to final state, if timer is ready
937 )))