|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 134400 (0x20d00) Types: TextFile Names: »tsatclst«
└─⟦a41ae585a⟧ Bits:30001842 SW-save af projekt 1000, Alarm-system └─⟦72244f0ef⟧ └─⟦this⟧ »tsatclst«
\f outlst 81.06.24. 17.09. page 1 10 1 PROCESS atconnector( 20 2 op_sem : sempointer; 30 3 VAR 40 4 main_sem , (* Pointer to ATC's main semaphore. 50 5 - All messages are received here *) 60 6 queue_sem : !ts_pointer; (* Pointers to the queue semaphore, that 70 7 - holds control an test messages while ATC is busy *) 80 8 VAR 90 9 ath_sem , (* Pointer to the main semaphore of ATH *) 100 10 driver_sem , (* Pointer to main semaphore of LAM driver *) 110 11 com_pool : !sempointer; (* Pointer to the semaphore that holds 120 12 - the vacant message resources of the TS *) 130 13 VAR 140 14 activity : connector_state; 150 15 VAR 160 16 delay : integer; 170 17 <*p 180 18 VAR 190 19 node_test_frequency : !integer; 200 20 VAR 210 21 traffic_counter : integer; 220 22 p*> 230 23 VAR 240 24 dc_macro , (* Macro address of own dc *) 250 25 ts_macro : !macroaddr; (* Macro address of own ts *) 260 26 own_addr : !integer; (* Micro address of this ATC inarnation *) 270 27 channel_no : !byte ); (* i/o channel number used by this ATC incarnation *) 280 28 290 29 300 30 CONST 310 31 version = "vers 3.12 /"; 320 32 \f outlst 81.06.24. 17.09. page 2 1010 33 (********************************************************************************* 1020 34 * 1030 35 * description : The purpose and function of the AT_CONNECTOR is mainly to 1040 36 * run the protocol with an AT. The ATC is the master of 1050 37 * this communication. 1060 38 * The state of the transmission line is monitored by ATC 1070 39 * and alarms concerning the conditions of transmission are 1080 40 * signalled to PAC or DC. 1090 41 * Furthermore commands originating from DC and AC are executed 1100 42 * and alarms from AT are signalled to an AC. 1110 43 * AT_CONNECTOR participates in the module supervision in 1120 44 * the TS. 1130 45 * 1140 46 * externals : check5 1150 47 * testopen 1160 48 * testout 1170 49 * receipt_message 1180 50 * reject_message 1190 51 * 1200 52 * environment : alarm environment (latest version) 1210 53 * 1220 54 * author : NLA 1230 55 * 1240 56 *********************************************************************************) 1250 57 \f outlst 81.06.24. 17.09. page 3 2010 58 (********************************************************************************* 2020 59 * 2030 60 * PSEUDO CODE of AT_CONNECTOR 2040 61 * 2050 62 * process atconnector 2060 63 * 2070 64 * constant, type and variable declaration parts 2080 65 * 1) shielded types 2090 66 * 2) telegrams from TS to AT 2100 67 * 3) telegrams from AT to TS 2110 68 * 4) state telegrams from AT to TS 2120 69 * 5) operation codes and formats 2130 70 * 6) watch central table and management of it 2140 71 * 7) management of states and protocol 2150 72 * 8) supervision of transmission line 2160 73 * 9) miscellaneous 2170 74 * 2180 75 * forward declaration part 2190 76 * 2200 77 * subroutine declaration part 2210 78 * 2220 79 * 2230 80 * begin 2240 81 * 2250 82 * initialize; 2260 83 * 2270 84 * restrict_protocol; 2280 85 * <* end of initialize sequence *> 2290 86 * 2300 87 * repeat <* forever *> 2310 88 * 2320 89 * if conversation = idle then 2330 90 * begin 2340 91 * if open( queue ) then <* preprocess queue *> 2350 92 * begin 2360 93 * wait( msg, queue ); 2370 94 * initiate_conversation <* messages in the queue always involve AT *> 2380 95 * end 2390 96 * else 2400 97 * begin 2410 98 * sendtimer( delay_msg ); 2420 99 * send_telegram( poll, 0 ) 2430 100 * end 2440 101 * end; 2450 102 * 2460 103 * wait( msg, main ); \f outlst 81.06.24. 17.09. page 4 2470 104 * 2480 105 * if ownertest( driver_pool, msg ) then 2490 106 * driver_msg :=: msg 2500 107 * else 2510 108 * case message_origin of 2520 109 * 2530 110 * ATH: 2540 111 * begin 2550 112 * if operation_code in (.control, testi1, testi2, teste.) then 2560 113 * signal( msg, queue ) 2570 114 * else 2580 115 * read_write( msg ) <* AT not involved, execute at once *> 2590 116 * end; 2600 117 * 2610 118 * DRIVER: 2620 119 * if transmission_error and limit_overflow then 2630 120 * signal( call_limit_alarm, ATH ) 2640 121 * else 2650 122 * begin 2660 123 * if limit_underflow then 2670 124 * signal( recall_limit_alarm, ATH ); 2680 125 * 2690 126 * case AT_operation_code of 2700 127 * 2710 128 * p_ack: conversation:= idle; 2720 129 * 2730 130 * au_alarm: 2740 131 * if no_of_bytes = AVC_block_lth then 2750 132 * signal( au_alarm, AVC ) 2760 133 * else 2770 134 * send_telegram( poll, 0 ); 2780 135 * 2790 136 * addr: 2800 137 * begin 2810 138 * search_address_code; 2820 139 * send_telegram( poll, 0 ) 2830 140 * end; 2840 141 * 2850 142 * state_alarm: 2860 143 * if state_byte <> current_state then 2870 144 * begin 2880 145 * update_current_state; 2890 146 * signal( state_alarm, PAC ) 2900 147 * end; 2910 148 * 2920 149 * d_ack: \f outlst 81.06.24. 17.09. page 5 2930 150 * if no_of_bytes = block_lth then 2940 151 * signal( control_receipt, sender ) 2950 152 * else 2960 153 * send_telegram( cntrl, next_cntrl_byte ); 2970 154 * 2980 155 * t_ack, 2990 156 * e_ack: 3000 157 * begin 3010 158 * signal( test_receipt, sender ); 3020 159 * conversation:= idle 3030 160 * end; 3040 161 * 3050 162 * end <* case AT_operation_code *> 3060 163 * 3070 164 * end 3080 165 * 3090 166 * end <* case message origin *> 3100 167 * 3110 168 * until forever 3120 169 * 3130 170 * end. <* process AT_CONNECTOR *> 3140 171 * 3150 172 *********************************************************************************) 3160 173 3170 174 3180 175 3190 176 3200 177 \f outlst 81.06.24. 17.09. page 6 4010 178 (********************************************************************************* 4020 179 * 4030 180 * ABBREVIATION LIST 4040 181 * 4050 182 * aac alternative alarm centre 4060 183 * ac, AC alarm centre 4070 184 * at, AT alarm terminal 4080 185 * atc, ATC alarm terminal connector 4090 186 * ath, ATH alarm terminal (connector) handler 4100 187 * au alarm unit 4110 188 * dc, DC district centre 4120 189 * driver lam driver 4130 190 * msg reference to a message 4140 191 * pac, PAC primary alarm centre 4150 192 * r_w read_write 4160 193 * sem semaphore 4170 194 * s_a.. stop activity (e.g. s_a_limit) 4180 195 * t_e../..t_e transmission error (e.g. t_e_counter) 4190 196 * TS, ts terminal station 4200 197 * 4210 198 * 4220 199 * 4230 200 * 4240 201 * 4250 202 * 4260 203 * 4270 204 * 4280 205 * 4290 206 * 4300 207 * 4310 208 * 4320 209 *********************************************************************************) 4330 210 4340 211 \f outlst 81.06.24. 17.09. page 7 5010 212 (********************************************************************************* 5020 213 * declaration part 1: shielded types 5030 214 *********************************************************************************) 5040 215 5050 216 VAR 5060 217 5070 218 (* pools. Allocation takes place with main_sem as answer semaphore *) 5080 219 5090 220 driver_pool : pool 1 OF integer; (* driver message is allocated from this pool *) 5100 221 delay_pool : pool 1; (* delay message is allocated from this pool *) 5110 222 5120 223 (* reference variables *) 5130 224 5140 225 delay_msg, (* holds delay out message while it's unused *) 5150 226 ath_msg, (* holds message from ATH while waiting for response from AT *) 5160 227 driver_msg, (* holds message from DRIVER while while it's unused *) 5170 228 alarm_msg, (* general use. Holds alarm message while it's updated *) 5180 229 atc_msg : reference; (* holds message from input semaphore 5190 230 while it's classified *) 5200 231 \f outlst 81.06.24. 17.09. page 8 6010 232 (********************************************************************************* 6020 233 * declaration part 2: telegrams from master (TS) to slave (AT) 6030 234 * 6040 235 *********************************************************************************) 6050 236 6060 237 CONST 6070 238 (* operation codes *) 6080 239 poll_opc = 0; 6090 240 atc_cntrl = 1; 6100 241 atc_testi = 2; 6110 242 atc_teste = 3; 6120 243 6130 244 (* data bytes *) 6140 245 poll_byte = 0; 6150 246 testi1_byte = 0; 6160 247 testi2_byte = 1; 6170 248 6180 249 TYPE 6190 250 atc_op_codes = poll_opc..atc_teste; 6200 251 6210 252 atc_format = PACKED RECORD 6220 253 ! out_data : byte; 6230 254 ! atc_opc : atc_op_codes; 6240 255 ! serial_number : boolean; 6250 256 ! checkbits : 0..31 6260 257 END; 6270 258 6280 259 VAR 6290 260 last_telegram : atc_format := atc_format( 0, 0, false, 0 ); 6300 261 6310 262 \f outlst 81.06.24. 17.09. page 9 7010 263 (********************************************************************************* 7020 264 * declaration part 3: telegrams from slave (AT) to master (TS) 7030 265 * 7040 266 *********************************************************************************) 7050 267 7060 268 CONST 7070 269 (* operation codes *) 7080 270 p_ack = 0; 7090 271 state = 1; 7100 272 au_alarm = 2; 7110 273 addr = 3; 7120 274 d_ack = 4; 7130 275 t_ack = 5; 7140 276 e_ack = 6; 7150 277 n_ack = 7; 7160 278 7170 279 TYPE 7180 280 at_op_codes = p_ack..n_ack; 7190 281 7200 282 at_format = PACKED RECORD 7210 283 ! in_data : byte; 7220 284 ! at_opc : at_op_codes; 7230 285 ! checkbits : 0..31 7240 286 END; 7250 287 \f outlst 81.06.24. 17.09. page 10 8010 288 (********************************************************************************* 8020 289 * declaration part 4: state telegrams from slave (AT) to master (TS) 8030 290 * 8040 291 *********************************************************************************) 8050 292 8060 293 CONST 8070 294 (* at state bits *) 8080 295 unused = 0; 8090 296 at_time_out = 1; 8100 297 hs_error = 2; 8110 298 au_error = 3; 8120 299 serif_error = 4; 8130 300 restart = 5; 8140 301 batt_limit = 6; 8150 302 batt_supply = 7; 8160 303 8170 304 TYPE 8180 305 state_bits = unused..batt_supply; 8190 306 state_byte = SET OF state_bits; 8200 307 8210 308 VAR 8220 309 state_bit : state_bits := unused; 8230 310 \f outlst 81.06.24. 17.09. page 11 9010 311 (********************************************************************************* 9020 312 * declaration part 5: alarm net operation codes 9030 313 * 9040 314 *********************************************************************************) 9050 315 9060 316 CONST 9070 317 (* pac log operation code *) 9080 318 pac_alarm_log = #h01; 9090 319 9100 320 (* garbage message *) 9110 321 reject_opc = #h12; 9120 322 9130 323 (* alarms *) 9140 324 au_alarm_opc = #h30; 9150 325 line_alarm = #h31; 9160 326 state_alarm = #h32; 9170 327 service_alarm = #h34; 9180 328 s_a_alarm = #h35; 9190 329 9200 330 (* control *) 9210 331 ts_cntrl = #h40; 9220 332 group_cntrl = #h44; 9230 333 9240 334 (* tests *) 9250 335 ts_testi1 = #h80; 9260 336 ts_testi2 = #h82; 9270 337 ts_teste = #h84; 9280 338 9290 339 (* change of activity *) 9300 340 ts_newactivity = #h90; 9310 341 9320 342 connect_test = #h92; 9330 343 9340 344 (* updating of alarm centre table *) 9350 345 upd_ac_table = #ha0; 9360 346 9370 347 (* read package counter *) 9380 348 read_package_count = #hb4; 9390 349 9400 350 (* read or update of parameter *) 9410 351 r_w_tec = #hb2; 9420 352 r_w_service_limit = #hb6; 9430 353 r_w_s_a_limit = #hba; 9440 354 r_w_max_succ_t_e = #hbc; 9450 355 \f outlst 81.06.24. 17.09. page 12 10010 356 node_test = #hc0; 10020 357 10030 358 dummy_alarm = #hc8; 10040 359 10050 360 break_proc_end = #hce; 10060 361 \f outlst 81.06.24. 17.09. page 13 11010 362 (********************************************************************************* 11020 363 * declaration part 6: alarm centre table and the management of it 11030 364 * 11040 365 *********************************************************************************) 11050 366 11060 367 VAR 11070 368 ac_tbl : ac_address_table; 11080 369 11090 370 actual_ac_index : ac_table_range := pac_index; 11100 371 top_aac_index : upper_ac_tbl_index := 0; 11110 372 \f outlst 81.06.24. 17.09. page 14 12010 373 (********************************************************************************* 12020 374 * declaration part 7: management of states and protocol 12030 375 * 12040 376 *********************************************************************************) 12050 377 12060 378 TYPE 12070 379 type_of_conversation = ( 12080 380 idle, (* no telegram pending *) 12090 381 busy, (* poll pending *) 12100 382 control, (* control pending *) 12110 383 testi, (* testi1 or testi2 telegram pending *) 12120 384 teste, (* test extern pending *) 12130 385 coll_alarm1 , (* ATC is collecting multi byte alarm *) 12140 386 coll_alarm2 ); (* a poll is pending to look for a new alarm *) 12150 387 12160 388 VAR 12170 389 reject_code : result_range := not_ready; 12180 390 12190 391 conversation : type_of_conversation := idle; 12200 392 \f outlst 81.06.24. 17.09. page 15 13010 393 (********************************************************************************* 13020 394 * declaration part 8: supervision of transmission line 13030 395 * 13040 396 *********************************************************************************) 13050 397 13060 398 TYPE 13070 399 valid_set = SET OF at_op_codes; 13080 400 13090 401 t_e_kind_type = ( 13100 402 no_error, 13110 403 time_excess, (* reported from DRIVER *) 13120 404 not_ack, (* n_ack operation code received *) 13130 405 bit_error, (* error in checksum *) 13140 406 ill_opc, (* unexpected operation code in response *) 13150 407 channel_error ); (* reported from DRIVER *) 13160 408 13170 409 VAR 13180 410 t_e_step : integer := trans_err_rate; (* increment of t_e_counter 13190 411 when a transmission error occurs *) 13200 412 service_limit : integer := service_lim; (* t_e_counter service_limit. *) 13210 413 s_a_limit : integer := stop_poll_lim; (* t_e_counter stop activity limit. *) 13220 414 max_succ_t_e : integer := max_succ_lin_err; (* number of successive 13230 415 transmission errors before line alarm *) 13240 416 13250 417 t_e_counter, (* transmission error counter *) 13260 418 no_succ_t_e : integer := 0; 13270 419 13280 420 valid_response : ARRAY( busy..coll_alarm2 ) OF valid_set; 13290 421 13300 422 t_e_kind : t_e_kind_type := no_error; 13310 423 13320 424 line_state : ( 13330 425 low, (* t_e_counter below service limit *) 13340 426 serv_lim_excess, (* service_limit exceeded *) 13350 427 s_a_lim_excess ) := low; (* stop activity limit exceeded *) 13360 428 13370 429 13380 430 13390 431 \f outlst 81.06.24. 17.09. page 16 14010 432 (********************************************************************************* 14020 433 * declaration part 9: miscellaneous 14030 434 * 14040 435 *********************************************************************************) 14050 436 14060 437 TYPE 14070 438 receipt_route = ARRAY( netc_route..netc_route1 ) OF byte; 14080 439 14090 440 CONST 14100 441 route_vect = receipt_route( at_route, at_route1 ); 14110 442 override = false; 14120 443 dummy = 0; 14130 444 14140 445 TYPE 14150 446 create_ch_format = ARRAY( 0..1 ) OF byte; 14160 447 14170 448 VAR 14180 449 package_count : integer := 0; (* is counted circular from 0 14190 450 through 32766 = ( max_int - 1) *) 14200 451 14210 452 delay3, delay4 : byte; (* contents u3 and u4 values of delay message *) 14220 453 14230 454 at_op_code : at_op_codes := 0; 14240 455 at_data : byte := 0; 14250 456 14260 457 z : zone; 14270 458 \f outlst 81.06.24. 17.09. page 17 15010 459 (********************************************************************************* 15020 460 * forward declaration part 15030 461 * 15040 462 *********************************************************************************) 15050 463 15060 464 PROCEDURE restrict_protocol; 15070 465 FORWARD; 15080 466 15090 467 15100 468 <*p 15110 469 PROCEDURE exception( excode: integer ); 15120 470 FORWARD; 15130 471 p*> 15140 472 \f outlst 81.06.24. 17.09. page 18 16010 473 <*t PROCEDURE print_telegram( VAR msg: reference; transmit: boolean; param: byte ); 16020 474 16030 475 TYPE 16040 476 hexa = ARRAY( 0..15 ) OF char; 16050 477 16060 478 CONST 16070 479 hex_convert = hexa( "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", 16080 480 "a", "b", "c", "d", "e", "f" ); 16090 481 16100 482 VAR 16110 483 string : alfa := alfa( " " ); 16120 484 16130 485 BEGIN 16140 486 16150 487 IF transmit THEN 16160 488 LOCK msg AS locvar: atc_format DO 16170 489 WITH locvar DO 16180 490 BEGIN 16190 491 16200 492 string( 1 ):= "T"; 16210 493 string( 4 ):= hex_convert( atc_opc ); 16220 494 string( 6 ):= hex_convert( ord( serial_number ) ); 16230 495 string( 8 ):= hex_convert( checkbits DIV 16 ); 16240 496 string( 9 ):= hex_convert( checkbits MOD 16 ); 16250 497 string( 11 ):= hex_convert( out_data DIV 16 ); 16260 498 string( 12 ):= hex_convert( out_data MOD 16 ) 16270 499 16280 500 END (* lock msg *) 16290 501 ELSE 16300 502 LOCK msg AS locvar: at_format DO 16310 503 WITH locvar DO 16320 504 BEGIN 16330 505 16340 506 string( 1 ):= "R"; 16350 507 string( 6 ):= hex_convert( at_opc ); 16360 508 string( 8 ):= hex_convert( checkbits DIV 16 ); 16370 509 string( 9 ):= hex_convert( checkbits MOD 16 ); 16380 510 string( 11 ):= hex_convert( in_data DIV 16 ); 16390 511 string( 12 ):= hex_convert( in_data MOD 16 ) 16400 512 16410 513 END; (* lock msg *) 16420 514 16430 515 testout( z, string, param ) 16440 516 16450 517 END;(* procedure print_telegram *) t*> 16460 518 \f outlst 81.06.24. 17.09. page 19 17010 519 PROCEDURE create_channel; 17020 520 17030 521 (********************************************************************************* 17040 522 * description : Updates and sends a create channel message to DRIVER 17050 523 * 17060 524 * globals : driver_msg 17070 525 * conversation 17080 526 *********************************************************************************) 17090 527 17100 528 BEGIN 17110 529 1 ! 17120 530 2 ! LOCK driver_msg AS locvar: create_ch_format DO 17130 531 3 ! WITH driver_msg^ DO 17140 532 4 ! BEGIN 17150 533 5 ! ! 17160 534 6 ! ! u1:= create_at_ch; 17170 535 7 ! ! u2:= channel_no; 17180 536 8 ! ! u3:= at_route; 17190 537 9 ! ! 17200 538 10 ! ! locvar( 0 ):= at_control; 17210 539 11 ! ! locvar( 1 ):= con_lam_time 17220 540 12 ! ! 17230 541 13 ! END; (* lock *) 17240 542 14 ! 17250 543 15 ! conversation:= busy; 17260 544 16 ! 17270 545 17 ! signal( driver_msg, driver_sem^ ) 17280 546 18 ! 17290 547 19 END; (* procedure create_channel *) 17300 548 \f outlst 81.06.24. 17.09. page 20 18010 549 PROCEDURE send_telegram( 18020 550 new_opc : atc_op_codes; 18030 551 data_byte : byte; 18040 552 new_serial_no , 18050 553 transmission_error : boolean 18060 554 ); 18070 555 18080 556 (********************************************************************************* 18090 557 * description : Updates and sends a telegram to AT (through DRIVER) and 18100 558 * requests a delay message from TIMER 18110 559 * 18120 560 * call value : new_opc = operation code of telegram or unsignificant 18130 561 * data_byte = data byte of telegram or unsignificant 18140 562 * new_serial_no = indicates whether serial number of 18150 563 * telegram is to be alternated. Significant 18160 564 * only if a transmission error is detected. 18170 565 * transmision_error = indicates whether last telegram is to be 18180 566 * repeated. 18190 567 * return value : all are unchanged 18200 568 * globals : driver_msg = nil after the call 18210 569 * last_telegram = updated 18220 570 *********************************************************************************) 18230 571 18240 572 BEGIN 18250 573 1 ! 18260 574 2 ! IF transmission_error AND ( NOT new_serial_no ) THEN (* repeat last telegram *) 18270 575 3 ! LOCK driver_msg AS locvar: atc_format DO 18280 576 4 ! locvar:= last_telegram (* end lock driver_msg *) 18290 577 5 ! ELSE 18300 578 6 ! WITH last_telegram DO 18310 579 7 ! BEGIN 18320 580 8 ! ! 18330 581 9 ! ! IF NOT transmission_error THEN (* set up new telegram *) 18340 582 10 ! ! BEGIN 18350 583 11 ! ! ! 18360 584 12 ! ! ! atc_opc:= new_opc; 18370 585 13 ! ! ! serial_number:= NOT serial_number; 18380 586 14 ! ! ! out_data:= data_byte 18390 587 15 ! ! ! 18400 588 16 ! ! END 18410 589 17 ! ! ELSE 18420 590 18 ! ! IF new_serial_no THEN 18430 591 19 ! ! serial_number:= NOT serial_number; 18440 592 20 ! ! 18450 593 21 ! ! LOCK driver_msg AS locvar: atc_format DO 18460 594 22 ! ! locvar:= last_telegram; (* end lock driver_msg *) \f outlst 81.06.24. 17.09. page 21 18470 595 23 ! ! 18480 596 24 ! ! IF check5( driver_msg, generate ) THEN; 18490 597 25 ! ! 18500 598 26 ! ! LOCK driver_msg AS locvar: atc_format DO 18510 599 27 ! ! last_telegram:= locvar (* end lock driver_msg *) 18520 600 28 ! ! 18530 601 29 ! END; 18540 602 30 ! 18550 603 31 ! <*t print_telegram( driver_msg, true, ord( conversation ) ); t*> 18560 604 32 ! 18570 605 33 ! IF NOT nil( delay_msg ) THEN 18580 606 34 ! WITH delay_msg^ DO 18590 607 35 ! BEGIN 18600 608 36 ! ! 18610 609 37 ! ! u3:= delay3; 18620 610 38 ! ! u4:= delay4; 18630 611 39 ! ! 18640 612 40 ! ! sendtimer( delay_msg ) 18650 613 41 ! ! 18660 614 42 ! END; 18670 615 43 ! 18680 616 44 ! WITH driver_msg^ DO 18690 617 45 ! BEGIN 18700 618 46 ! ! 18710 619 47 ! ! u1:= write_read_at; 18720 620 48 ! ! u2:= channel_no 18730 621 49 ! ! 18740 622 50 ! END; 18750 623 51 ! 18760 624 52 ! signal( driver_msg, driver_sem^ ) 18770 625 53 ! 18780 626 54 END; (* procedure send_telegram *) 18790 627 \f outlst 81.06.24. 17.09. page 22 19010 628 PROCEDURE handle_queue( 19020 629 VAR 19030 630 msg : reference; 19040 631 reject_cause : result_range 19050 632 ); 19060 633 19070 634 (********************************************************************************* 19080 635 * description : Selects a message from the queue with a legal operation 19090 636 * code. Messages illegal for the moment are receipted 19100 637 * with result = reject_cause. 19110 638 * call value : msg = nil or reference to a uncompleted message 19120 639 * return value : reject_cause = cause of rejection 19130 640 * msg = nil or a reference to a legal message 19140 641 * globals : ath_msg, queue_sem 19150 642 *********************************************************************************) 19160 643 19170 644 BEGIN 19180 645 1 ! 19190 646 2 ! IF NOT nil( msg ) OR open( queue_sem.w^ ) THEN 19200 647 3 ! REPEAT 19210 648 4 ! ! 19220 649 5 ! ! IF nil( msg ) THEN 19230 650 6 ! ! wait( msg, queue_sem.w^ ); 19240 651 7 ! ! 19250 652 8 ! ! WITH msg^ DO 19260 653 9 ! ! IF ( u3 = dummy_route ) THEN 19270 654 10 ! ! return( msg ) 19280 655 11 ! ! ELSE 19290 656 12 ! ! BEGIN 19300 657 13 ! ! ! 19310 658 14 ! ! ! IF ( u4 IN (.ts_cntrl, group_cntrl, ts_teste.) ) THEN 19320 659 15 ! ! ! package_count:= ( package_count + 1 ) MOD max_int; 19330 660 16 ! ! ! 19340 661 17 ! ! ! CASE reject_cause OF 19350 662 18 ! ! ! ! 19360 663 19 ! ! ! ! accepted : 19370 664 20 ! ! ! ! ; 19380 665 21 ! ! ! ! 19390 666 22 ! ! ! ! state_hs_error : 19400 667 23 ! ! ! ! IF ( u4 = ts_teste ) THEN 19410 668 24 ! ! ! ! receipt_message( msg, ath_sem, route_vect( u3 ), 0, reject_cause ) 19420 669 25 ! ! ! ! ; 19430 670 26 ! ! ! ! 19440 671 27 ! ! ! ! state_power_error , 19450 672 28 ! ! ! ! transmit_error , 19460 673 29 ! ! ! ! no_resources , \f outlst 81.06.24. 17.09. page 23 19470 674 30 ! ! ! ! no_connection , 19480 675 31 ! ! ! ! breaked , 19490 676 32 ! ! ! ! not_ready , 19500 677 33 ! ! ! ! passivated : 19510 678 34 ! ! ! ! receipt_message( msg, ath_sem, route_vect( u3 ), 0, reject_cause ) 19520 679 35 ! ! ! ! ; 19530 680 36 ! ! ! ! 19540 681 37 ! ! ! ! illegal_operation , 19550 682 38 ! ! ! ! state_au_error , 19560 683 39 ! ! ! ! state_serif_error : 19570 684 40 ! ! ! ! IF ( u4 IN (.ts_cntrl, group_cntrl, ts_teste.) ) THEN 19580 685 41 ! ! ! ! receipt_message( msg, ath_sem, route_vect( u3 ), 0, reject_cause ) 19590 686 42 ! ! ! ! ; 19600 687 43 ! ! ! ! 19610 688 44 ! ! ! ! OTHERWISE 19620 689 45 ! ! ! ! testout( z, "reject code: ", reject_cause ) 19630 690 46 ! ! ! ! 19640 691 47 ! ! ! END 19650 692 48 ! ! ! 19660 693 49 ! ! END 19670 694 50 ! ! 19680 695 51 ! UNTIL NOT nil( msg ) OR passive( queue_sem.w^ ) 19690 696 52 ! 19700 697 53 END; (* procedure handle_queue *) 19710 698 \f outlst 81.06.24. 17.09. page 24 20010 699 FUNCTION get_message( 20020 700 VAR 20030 701 msg : reference; 20040 702 operation_code , 20050 703 block_lth : byte; 20060 704 rec_macro : macroaddr; 20070 705 rec_micro , 20080 706 ac_index : integer 20090 707 ): boolean; 20100 708 20110 709 (********************************************************************************* 20120 710 * description : Waits max delay seconds for a message from com_pool. 20130 711 * If ATC is timed out and ath_msg or queue_sem holds 20140 712 * resources, these are receipted and another effort is 20150 713 * made. 20160 714 * A alarm net label is entered in the message. 20170 715 * call value : msg = nil 20180 716 * return value : get_message = true if a message is received, otherwise false. 20190 717 * msg = nil or reference to the message. 20200 718 * msg^.u1 = number of bytes to enter in data part 20210 719 * msg^.u2 = 0 ( will be used for counting ) 20220 720 * globals ath_msg 20230 721 * queue_sem 20240 722 *********************************************************************************) 20250 723 20260 724 BEGIN 20270 725 1 ! 20280 726 2 ! definetimer( true ); 20290 727 3 ! 20300 728 4 ! REPEAT 20310 729 5 ! ! 20320 730 6 ! ! CASE waitsd( msg, com_pool^, wait_sem_delay ) OF 20330 731 7 ! ! ! 20340 732 8 ! ! ! a_semaphore: 20350 733 9 ! ! ! LOCK msg AS locvar: alarmlabel DO 20360 734 10 ! ! ! WITH msg^, locvar DO 20370 735 11 ! ! ! BEGIN 20380 736 12 ! ! ! ! 20390 737 13 ! ! ! ! u1:= block_lth; 20400 738 14 ! ! ! ! u2:= 0; 20410 739 15 ! ! ! ! u3:= at_route; 20420 740 16 ! ! ! ! u4:= operation_code; 20430 741 17 ! ! ! ! 20440 742 18 ! ! ! ! rec.macro:= rec_macro; 20450 743 19 ! ! ! ! rec.micro:= rec_micro; 20460 744 20 ! ! ! ! \f outlst 81.06.24. 17.09. page 25 20470 745 21 ! ! ! ! send.macro:= ts_macro; 20480 746 22 ! ! ! ! send.micro:= own_addr; 20490 747 23 ! ! ! ! 20500 748 24 ! ! ! ! ts_add( 0 ):= ac_index 20510 749 25 ! ! ! ! 20520 750 26 ! ! ! END (* lock *) 20530 751 27 ! ! ! ; 20540 752 28 ! ! ! 20550 753 29 ! ! ! a_delay: 20560 754 30 ! ! ! BEGIN 20570 755 31 ! ! ! ! 20580 756 32 ! ! ! ! <*trace( #h0f );t*> 20590 757 33 ! ! ! ! handle_queue( ath_msg, no_resources ); 20600 758 34 ! ! ! ! 20610 759 35 ! ! ! ! (* obs!!! clean up main if ATC must keep trying *) 20620 760 36 ! ! ! ! 20630 761 37 ! ! ! END 20640 762 38 ! ! ! ; 20650 763 39 ! ! ! 20660 764 40 ! ! ! OTHERWISE 20670 765 41 ! ! ! 20680 766 42 ! ! END 20690 767 43 ! ! 20700 768 44 ! UNTIL passive( queue_sem.w^ ) OR NOT nil( msg ); 20710 769 45 ! 20720 770 46 ! definetimer( false ); 20730 771 47 ! 20740 772 48 ! get_message:= NOT nil( msg ) 20750 773 49 ! 20760 774 50 END; (* function get_message *) 20770 775 \f outlst 81.06.24. 17.09. page 26 21010 776 FUNCTION ready_byte_msg( 21020 777 VAR 21030 778 msg : reference; 21040 779 data_byte : byte 21050 780 ): boolean; 21060 781 21070 782 (********************************************************************************* 21080 783 * description : Enters one data byte in the message data part. 21090 784 * call value : msg = references message to fill 21100 785 * msg^.u1 = number of bytes to enter 21110 786 * msg^.u2 = last byte entered 21120 787 * data_byte = byte in question 21130 788 * return value : ready_byte_msg = true if filling is completed 21140 789 * msg^.u2 = last byte entered. 21150 790 * data_byte = unchanged 21160 791 * globals : none 21170 792 *********************************************************************************) 21180 793 21190 794 BEGIN 21200 795 1 ! 21210 796 2 ! LOCK msg AS locvar: al_form_byte DO 21220 797 3 ! WITH msg^, locvar, al_label DO 21230 798 4 ! BEGIN 21240 799 5 ! ! 21250 800 6 ! ! IF ( u1 > u2 ) THEN 21260 801 7 ! ! BEGIN 21270 802 8 ! ! ! 21280 803 9 ! ! ! u2:= u2 + 1; 21290 804 10 ! ! ! data( u2 ):= data_byte 21300 805 11 ! ! ! 21310 806 12 ! ! END; 21320 807 13 ! ! 21330 808 14 ! ! ready_byte_msg:= ( u2 = u1 ) 21340 809 15 ! ! 21350 810 16 ! END 21360 811 17 ! 21370 812 18 END; (* function ready_byte_msg *) 21380 813 \f outlst 81.06.24. 17.09. page 27 22010 814 PROCEDURE finish_message( 22020 815 VAR 22030 816 msg : reference; 22040 817 res : result_range; 22050 818 log_to_pac : boolean 22060 819 ); 22070 820 22080 821 (*********************************************************************************** 22090 822 * description : Updates the user fields and message label part and sends 22100 823 * the message to ATH. 22110 824 * A log of an alarm may be send to PAC through ATH. 22120 825 * call value : msg = references message to be send 22130 826 * msg^.u2 = number of bytes except for alarmlabel. 22140 827 * res = message label information 22150 828 * log_to_pac = true if the alarm is to be logged at PAC 22160 829 * return value : msg = nil 22170 830 * globals : none 22180 831 ************************************************************************************) 22190 832 22200 833 22210 834 VAR 22220 835 alarm_bytes : data_bytes; 22230 836 block_lth : byte; 22240 837 22250 838 BEGIN 22260 839 1 ! 22270 840 2 ! LOCK msg AS locvar: al_form_byte DO 22280 841 3 ! WITH msg^, locvar, locvar.al_label DO 22290 842 4 ! BEGIN 22300 843 5 ! ! 22310 844 6 ! ! no_of_by:= label_size + u2; 22320 845 7 ! ! result:= res; 22330 846 8 ! ! 22340 847 9 ! ! IF log_to_pac THEN 22350 848 10 ! ! BEGIN 22360 849 11 ! ! ! 22370 850 12 ! ! ! block_lth:= u2; 22380 851 13 ! ! ! 22390 852 14 ! ! ! IF ( block_lth > 0 ) THEN 22400 853 15 ! ! ! FOR u2:= 1 TO block_lth DO 22410 854 16 ! ! ! alarm_bytes( u2 ):= data( u2 ) 22420 855 17 ! ! ! 22430 856 18 ! ! END; 22440 857 19 ! ! 22450 858 20 ! ! IF u4 IN (.pac_alarm_log, au_alarm_opc, line_alarm, state_alarm.) THEN 22460 859 21 ! ! package_count:= ( package_count + 1 ) MOD max_int \f outlst 81.06.24. 17.09. page 28 22470 860 22 ! ! 22480 861 23 ! END; (* lock msg *) 22490 862 24 ! 22500 863 25 ! signal( msg, ath_sem^ ); 22510 864 26 ! 22520 865 27 ! IF log_to_pac THEN 22530 866 28 ! WITH ac_tbl( pac_index ) DO 22540 867 29 ! IF get_message( msg, pac_alarm_log, block_lth, dummy_macro, dummy, sac_rac_ix ) THEN 22550 868 30 ! BEGIN 22560 869 31 ! ! 22570 870 32 ! ! LOCK msg AS locvar: al_form_0001 DO 22580 871 33 ! ! WITH msg^, locvar, al_label, aac_address DO 22590 872 34 ! ! BEGIN 22600 873 35 ! ! ! 22610 874 36 ! ! ! micro:= ac_tbl( actual_ac_index ).sac_rac_ix; 22620 875 37 ! ! ! 22630 876 38 ! ! ! IF ( block_lth > 0 ) THEN 22640 877 39 ! ! ! FOR u2:= 1 TO block_lth DO 22650 878 40 ! ! ! data( u2 ):= alarm_bytes( u2 ); 22660 879 41 ! ! ! 22670 880 42 ! ! ! u2:= block_lth + 4 22680 881 43 ! ! ! 22690 882 44 ! ! END; 22700 883 45 ! ! 22710 884 46 ! ! finish_message( msg, res, NOT log_to_pac ) 22720 885 47 ! ! 22730 886 48 ! END 22740 887 49 ! 22750 888 50 END; (* procedure finish_message *) 22760 889 \f outlst 81.06.24. 17.09. page 29 23010 890 FUNCTION search_addr_code( table_key: byte; VAR table_index: ac_table_range ): boolean; 23020 891 23030 892 (********************************************************************************** 23040 893 * description : Searches ac address table for the address code of a 23050 894 * alarm centre. 23060 895 * 23070 896 * call value : table_key = address code to search 23080 897 * table_index = undefined 23090 898 * return value : search_addr_code = true if the entry is found else false 23100 899 * table_key = unchanged 23110 900 * table_index = indices entry if it exists 23120 901 * globals : ac_tbl = unchanged 23130 902 *********************************************************************************) 23140 903 23150 904 BEGIN 23160 905 1 ! 23170 906 2 ! table_index:= pac_index; 23180 907 3 ! 23190 908 4 ! WHILE ( table_index < top_aac_index ) AND 23200 909 5 ! ( table_key <> ac_tbl( table_index ).addr_code ) DO 23210 910 6 ! table_index:= table_index + 1; 23220 911 7 ! 23230 912 8 ! search_addr_code:= ( top_aac_index > 0 ) AND ( table_key = ac_tbl( table_index ).addr_code ) 23240 913 9 ! 23250 914 10 END; (* function search_addr_code *) 23260 915 23270 916 23280 917 \f outlst 81.06.24. 17.09. page 30 24010 918 FUNCTION search_ac_index( table_key: integer; VAR table_index: ac_table_range ): boolean; 24020 919 24030 920 (********************************************************************************* 24040 921 * description : Searches ac address table for the index of a alarm centre. 24050 922 * 24060 923 * call value : table_key = entry to search 24070 924 * table_index = undefined 24080 925 * return value : search_ac_index = true if the entry is found, otherwise false 24090 926 * table_key = unchanged 24100 927 * table_index = indices entry if it exists 24110 928 * globals : ac_tbl = unchanged 24120 929 *********************************************************************************) 24130 930 24140 931 BEGIN 24150 932 1 ! 24160 933 2 ! table_index:= pac_index; 24170 934 3 ! 24180 935 4 ! WHILE ( table_index < top_aac_index ) AND 24190 936 5 ! ( table_key <> ac_tbl( table_index ).sac_rac_ix ) DO 24200 937 6 ! table_index:= table_index + 1; 24210 938 7 ! 24220 939 8 ! search_ac_index:= ( top_aac_index > 0 ) AND ( table_key = ac_tbl( table_index ).sac_rac_ix ) 24230 940 9 ! 24240 941 10 END; (* function search_ac_index *) 24250 942 \f outlst 81.06.24. 17.09. page 31 25010 943 PROCEDURE transm_cntrl( 25020 944 VAR at_op_code : at_op_codes; 25030 945 VAR at_data : byte; 25040 946 valid_response : valid_set ); 25050 947 25060 948 (********************************************************************************* 25070 949 * description : Monitors the conditions of transmission and manages the 25080 950 * sending of messages concerning the state of the transmission line. 25090 951 * Alarms are hold back when ATC is in service_poll. 25100 952 * The counters are not updated if AT state says no power 25110 953 * call value : at_op_code = undefined 25120 954 * at_data = undefined 25130 955 * valid_response = the set of responses from AT (slave) which are 25140 956 * valid in relation to the telegram send 25150 957 * return value : at_op_code = the operation code of the telegram 25160 958 * if this is found to be valid 25170 959 * at_data = data byte from telegram if transmission 25180 960 * isn't disturbed 25190 961 * valid_response = unchanged 25200 962 * globals : reject_code = updated 25210 963 * t_e_counter = updated 25220 964 * no_succ_line_err = updated 25230 965 * line_state = updated 25240 966 * t_e_kind = updated acc. to state/kind of transmission 25250 967 * max_succ_t_e, service_limit, s_a_limit 25260 968 * = unchanged 25270 969 ********************************************************************************) 25280 970 \f outlst 81.06.24. 17.09. page 32 26010 971 PROCEDURE send_line_state( op_code, data: byte ); 26020 972 26030 973 (********************************************************************************* 26040 974 * description : Sends a message to DC or PAC concerning the state of 26050 975 * the transmission line 26060 976 * call value : op_code = line, service or stop_activity alarm 26070 977 * data = call (may be time out) or recall 26080 978 * return value : both are unchanged 26090 979 * globals : none 26100 980 *********************************************************************************) 26110 981 26120 982 VAR 26130 983 msg : reference; 26140 984 26150 985 BEGIN 26160 986 1 ! 26170 987 2 ! IF ( activity = start_code ) THEN 26180 988 3 ! WITH ac_tbl( pac_index ) DO 26190 989 4 ! IF get_message( msg, op_code, 1, dc_macro, dc_erh_mic_addr, sac_rac_ix ) THEN 26200 990 5 ! IF ready_byte_msg( msg, data ) THEN 26210 991 6 ! finish_message( msg, accepted, override ) 26220 992 7 ! 26230 993 8 END; (* procedure send_line_state *) 26240 994 \f outlst 81.06.24. 17.09. page 33 27010 995 BEGIN (* procedure transm_cntrl *) 27020 996 1 ! 27030 997 2 ! IF ( driver_msg^.u2 = ok_result ) THEN (* no error result from DRIVER *) 27040 998 3 ! BEGIN 27050 999 4 ! ! 27060 1000 5 ! ! IF check5( driver_msg, check ) = false THEN (* bit error *) 27070 1001 6 ! ! t_e_kind:= bit_error 27080 1002 7 ! ! ELSE 27090 1003 8 ! ! LOCK driver_msg AS locvar: at_format DO 27100 1004 9 ! ! WITH locvar DO 27110 1005 10 ! ! BEGIN 27120 1006 11 ! ! ! 27130 1007 12 ! ! ! IF ( at_opc = n_ack ) THEN 27140 1008 13 ! ! ! t_e_kind:= not_ack 27150 1009 14 ! ! ! ELSE 27160 1010 15 ! ! ! IF at_opc IN valid_response THEN 27170 1011 16 ! ! ! BEGIN 27180 1012 17 ! ! ! ! 27190 1013 18 ! ! ! ! t_e_kind:= no_error; 27200 1014 19 ! ! ! ! at_op_code:= at_opc; 27210 1015 20 ! ! ! ! at_data:= in_data 27220 1016 21 ! ! ! ! 27230 1017 22 ! ! ! END 27240 1018 23 ! ! ! ELSE 27250 1019 24 ! ! ! t_e_kind:= ill_opc 27260 1020 25 ! ! ! 27270 1021 26 ! ! END (* lock driver_msg *) 27280 1022 27 ! ! 27290 1023 28 ! END 27300 1024 29 ! ELSE 27310 1025 30 ! BEGIN (* driver_msg^.u2 <> ok_result: error result from DRIVER *) 27320 1026 31 ! ! 27330 1027 32 ! ! IF ( driver_msg^.u2 = timeout_err ) THEN 27340 1028 33 ! ! t_e_kind:= time_excess 27350 1029 34 ! ! ELSE 27360 1030 35 ! ! t_e_kind:= channel_error 27370 1031 36 ! ! 27380 1032 37 ! END; 27390 1033 38 ! 27400 1034 39 ! <*t print_telegram( driver_msg, false, ord( t_e_kind ) ); t*> 27410 1035 40 ! \f outlst 81.06.24. 17.09. page 34 28010 1036 41 ! IF ( reject_code <> state_power_error ) THEN 28020 1037 42 ! BEGIN 28030 1038 43 ! ! 28040 1039 44 ! ! IF ( t_e_kind <> no_error ) THEN 28050 1040 45 ! ! BEGIN 28060 1041 46 ! ! ! 28070 1042 47 ! ! ! t_e_counter:= t_e_counter + 28080 1043 48 ! ! ! ( ord( t_e_counter < s_a_limit ) ) * t_e_step; (* don't go too high *) 28090 1044 49 ! ! ! 28100 1045 50 ! ! ! no_succ_t_e:= no_succ_t_e + 28110 1046 51 ! ! ! ( ord( no_succ_t_e < max_int ) ); (* don't overflow *) 28120 1047 52 ! ! ! 28130 1048 53 ! ! ! IF ( no_succ_t_e = max_succ_t_e ) THEN (* send line alarm *) 28140 1049 54 ! ! ! BEGIN 28150 1050 55 ! ! ! ! 28160 1051 56 ! ! ! ! send_line_state( line_alarm, 28170 1052 57 ! ! ! ! (**) ( ord( t_e_kind = time_excess ) * ( timeout_err - 1 ) + call ) ); 28180 1053 58 ! ! ! ! 28190 1054 59 ! ! ! ! IF ( activity = start_code ) THEN 28200 1055 60 ! ! ! ! reject_code:= transmit_error 28210 1056 61 ! ! ! ! 28220 1057 62 ! ! ! END 28230 1058 63 ! ! ! 28240 1059 64 ! ! END 28250 1060 65 ! ! ELSE 28260 1061 66 ! ! BEGIN 28270 1062 67 ! ! ! 28280 1063 68 ! ! ! t_e_counter:= t_e_counter - ord( t_e_counter > 0 ); (* freeze at zero point *) 28290 1064 69 ! ! ! 28300 1065 70 ! ! ! IF ( no_succ_t_e >= max_succ_t_e ) THEN (* recall line alarm *) 28310 1066 71 ! ! ! BEGIN 28320 1067 72 ! ! ! ! 28330 1068 73 ! ! ! ! send_line_state( line_alarm, recall ); 28340 1069 74 ! ! ! ! 28350 1070 75 ! ! ! ! IF ( activity = start_code ) THEN 28360 1071 76 ! ! ! ! IF reject_code = transmit_error THEN 28370 1072 77 ! ! ! ! reject_code:= accepted; 28380 1073 78 ! ! ! ! 28390 1074 79 ! ! ! ! no_succ_t_e:= 0 28400 1075 80 ! ! ! ! 28410 1076 81 ! ! ! END 28420 1077 82 ! ! ! 28430 1078 83 ! ! END; 28440 1079 84 ! ! \f outlst 81.06.24. 17.09. page 35 29010 1080 85 ! ! CASE line_state OF 29020 1081 86 ! ! ! 29030 1082 87 ! ! ! low: 29040 1083 88 ! ! ! IF ( t_e_counter >= service_limit ) THEN (* send service alarm *) 29050 1084 89 ! ! ! BEGIN 29060 1085 90 ! ! ! ! 29070 1086 91 ! ! ! ! send_line_state( service_alarm, call ); 29080 1087 92 ! ! ! ! line_state:= serv_lim_excess 29090 1088 93 ! ! ! ! 29100 1089 94 ! ! ! END; 29110 1090 95 ! ! ! 29120 1091 96 ! ! ! serv_lim_excess: 29130 1092 97 ! ! ! IF ( t_e_counter < service_limit ) THEN (* recall service alarm *) 29140 1093 98 ! ! ! BEGIN 29150 1094 99 ! ! ! ! 29160 1095 100 ! ! ! ! send_line_state( service_alarm, recall ); 29170 1096 101 ! ! ! ! line_state:= low 29180 1097 102 ! ! ! ! 29190 1098 103 ! ! ! END 29200 1099 104 ! ! ! ELSE 29210 1100 105 ! ! ! IF ( t_e_counter >= s_a_limit ) THEN (* send stop activity alarm *) 29220 1101 106 ! ! ! BEGIN 29230 1102 107 ! ! ! ! 29240 1103 108 ! ! ! ! send_line_state( s_a_alarm, call ); 29250 1104 109 ! ! ! ! line_state:= s_a_lim_excess 29260 1105 110 ! ! ! ! 29270 1106 111 ! ! ! END; 29280 1107 112 ! ! ! 29290 1108 113 ! ! ! s_a_lim_excess: 29300 1109 114 ! ! ! IF ( t_e_counter < s_a_limit ) THEN (* recall stop activity alarm *) 29310 1110 115 ! ! ! BEGIN 29320 1111 116 ! ! ! ! 29330 1112 117 ! ! ! ! send_line_state( s_a_alarm, recall ); 29340 1113 118 ! ! ! ! line_state:= serv_lim_excess 29350 1114 119 ! ! ! ! 29360 1115 120 ! ! ! END 29370 1116 121 ! ! ! 29380 1117 122 ! ! ! OTHERWISE 29390 1118 123 ! ! ! 29400 1119 124 ! ! END (* case line_state *) 29410 1120 125 ! ! 29420 1121 126 ! END 29430 1122 127 ! 29440 1123 128 END; (* procedure transm_cntrl *) 29450 1124 \f outlst 81.06.24. 17.09. page 36 30010 1125 PROCEDURE initiate_conversation( VAR request_msg: reference ); 30020 1126 30030 1127 (********************************************************************************* 30040 1128 * description : Initiates a conversation with the AT in accordance with 30050 1129 * the operation code in the message from ATH 30060 1130 * call value : request_msg = references message from ATH 30070 1131 * return value : request_msg = nil if the message is rejected, 30080 1132 * otherwise u1 = number of bytes to AT. 30090 1133 * u2 = 0 ( will be used for counting ) 30100 1134 * globals : conversation = updated according to operation code 30110 1135 * t_e_kind = unchanged 30120 1136 * ac_tbl = unchanged 30130 1137 *********************************************************************************) 30140 1138 30150 1139 VAR 30160 1140 result_code : result_range := accepted; 30170 1141 steering_ac_index : ac_table_range; 30180 1142 30190 1143 BEGIN 30200 1144 1 ! 30210 1145 2 ! LOCK request_msg AS locvar: al_form_byte DO 30220 1146 3 ! WITH request_msg^, locvar, al_label DO 30230 1147 4 ! 30240 1148 5 ! CASE u4 OF (* operation code *) 30250 1149 6 ! ! 30260 1150 7 ! ! ts_cntrl, 30270 1151 8 ! ! group_cntrl: 30280 1152 9 ! ! IF search_ac_index( ts_add( 0 ), steering_ac_index ) THEN 30290 1153 10 ! ! BEGIN 30300 1154 11 ! ! ! 30310 1155 12 ! ! ! IF ac_tbl( steering_ac_index ).steering THEN 30320 1156 13 ! ! ! BEGIN (* legal sender *) 30330 1157 14 ! ! ! ! 30340 1158 15 ! ! ! ! u1:= no_of_by - label_size; 30350 1159 16 ! ! ! ! 30360 1160 17 ! ! ! ! conversation:= control; 30370 1161 18 ! ! ! ! send_telegram( atc_cntrl, data( 1 ), 30380 1162 19 ! ! ! ! (**) ( t_e_kind = ill_opc ), override (* ! *) ) 30390 1163 20 ! ! ! ! (* ! override transmission error *) 30400 1164 21 ! ! ! ! 30410 1165 22 ! ! ! END 30420 1166 23 ! ! ! ELSE 30430 1167 24 ! ! ! result_code:= not_steering 30440 1168 25 ! ! ! 30450 1169 26 ! ! END 30460 1170 27 ! ! ELSE \f outlst 81.06.24. 17.09. page 37 30470 1171 28 ! ! result_code:= unknown_sender; 30480 1172 29 ! ! 30490 1173 30 ! ! ts_testi1, ts_testi2: 30500 1174 31 ! ! IF ( send.macro <> dc_macro ) THEN 30510 1175 32 ! ! result_code:= forbidden 30520 1176 33 ! ! ELSE 30530 1177 34 ! ! BEGIN 30540 1178 35 ! ! ! 30550 1179 36 ! ! ! u1:= 1; 30560 1180 37 ! ! ! no_of_by:= no_of_by + 1; 30570 1181 38 ! ! ! 30580 1182 39 ! ! ! conversation:= testi; 30590 1183 40 ! ! ! 30600 1184 41 ! ! ! IF ( u4 = ts_testi1 ) THEN 30610 1185 42 ! ! ! send_telegram( atc_testi, testi1_byte, 30620 1186 43 ! ! ! (**) ( t_e_kind = ill_opc ), override (* ! *) ) 30630 1187 44 ! ! ! (* ! override transmission error *) 30640 1188 45 ! ! ! ELSE 30650 1189 46 ! ! ! send_telegram( atc_testi, testi2_byte, 30660 1190 47 ! ! ! (**) ( t_e_kind = ill_opc ), override (* ! *) ) 30670 1191 48 ! ! ! (* ! override transmission error *) 30680 1192 49 ! ! ! 30690 1193 50 ! ! END; 30700 1194 51 ! ! 30710 1195 52 ! ! ts_teste: 30720 1196 53 ! ! BEGIN 30730 1197 54 ! ! ! 30740 1198 55 ! ! ! u1:= no_of_by - label_size; 30750 1199 56 ! ! ! 30760 1200 57 ! ! ! conversation:= teste; 30770 1201 58 ! ! ! send_telegram( atc_teste, data( 1 ), 30780 1202 59 ! ! ! (**) ( t_e_kind = ill_opc ), override (* ! *) ) 30790 1203 60 ! ! ! (* ! override transmission error *) 30800 1204 61 ! ! ! 30810 1205 62 ! ! END; 30820 1206 63 ! ! 30830 1207 64 ! ! OTHERWISE 30840 1208 65 ! ! 30850 1209 66 ! END; (* lock, case request_msg^.u4 *) 30860 1210 67 ! 30870 1211 68 ! IF ( result_code <> accepted ) THEN 30880 1212 69 ! receipt_message( request_msg, ath_sem, route_vect( request_msg^.u3 ), 0, result_code ) 30890 1213 70 ! ELSE 30900 1214 71 ! request_msg^.u2:= 0 30910 1215 72 ! 30920 1216 73 END; (* procedure initiate_conversation *) \f outlst 81.06.24. 17.09. page 38 30930 1217 \f outlst 81.06.24. 17.09. page 39 31010 1218 PROCEDURE exec_conn_operation( VAR msg: reference ); 31020 1219 31030 1220 (******************************************************************************** 31040 1221 * description : Executes on request from ATH those operation types, 31050 1222 * that doesn't involve DRIVER and sends a receipt to ATH 31060 1223 * call value : msg = reference to message from ATH 31070 1224 * return value : msg = nil 31080 1225 * globals : reject_code 31090 1226 * according to operation code: 31100 1227 * actual_ac_index, top_ac_index, ac_tbl 31110 1228 ********************************************************************************) 31120 1229 31130 1230 VAR 31140 1231 res : result_range := accepted; 31150 1232 table_index : ac_table_range; 31160 1233 \f outlst 81.06.24. 17.09. page 40 32010 1234 PROCEDURE connect_message( VAR msg: reference; user4: byte ); 32020 1235 32030 1236 VAR 32040 1237 work_addr : alarmnetaddr; 32050 1238 32060 1239 BEGIN 32070 1240 1 ! 32080 1241 2 ! LOCK msg AS locvar: al_form_0902 DO 32090 1242 3 ! WITH msg^, locvar, al_label DO 32100 1243 4 ! BEGIN 32110 1244 5 ! ! 32120 1245 6 ! ! u4:= user4; 32130 1246 7 ! ! 32140 1247 8 ! ! work_addr:= send; 32150 1248 9 ! ! send:= al_net_addr; 32160 1249 10 ! ! al_net_addr:= work_addr 32170 1250 11 ! ! 32180 1251 12 ! END 32190 1252 13 ! 32200 1253 14 END; (* procedure connect_message *) 32210 1254 \f outlst 81.06.24. 17.09. page 41 33010 1255 PROCEDURE compute_delay( param: integer ); 33020 1256 33030 1257 (********************************************************************************* 33040 1258 * description : Computes delay to enter the u3 and u4 fields of the delay 33050 1259 * message as (u3*2^u4) 33060 1260 * call value : param = integer value of delay ( seconds ) 33070 1261 * globals : delay = value of delay 33080 1262 * delay3, delay4 = altered according to formula above 33090 1263 *********************************************************************************) 33100 1264 33110 1265 BEGIN 33120 1266 1 ! 33130 1267 2 ! delay:= param; 33140 1268 3 ! 33150 1269 4 ! delay4:= 0; 33160 1270 5 ! 33170 1271 6 ! WHILE ( param > ( max_int DIV time_out_unit ) ) DO 33180 1272 7 ! BEGIN 33190 1273 8 ! ! 33200 1274 9 ! ! param:= param DIV 2; 33210 1275 10 ! ! delay4:= delay4 + 1 33220 1276 11 ! ! 33230 1277 12 ! END; 33240 1278 13 ! 33250 1279 14 ! param:= param * time_out_unit; 33260 1280 15 ! 33270 1281 16 ! WHILE ( param > max_byte ) DO 33280 1282 17 ! BEGIN 33290 1283 18 ! ! 33300 1284 19 ! ! param:= param DIV 2; 33310 1285 20 ! ! delay4:= delay4 + 1 33320 1286 21 ! ! 33330 1287 22 ! END; 33340 1288 23 ! 33350 1289 24 ! delay3:= param 33360 1290 25 ! 33370 1291 26 END; (* procedure compute_delay *) 33380 1292 \f outlst 81.06.24. 17.09. page 42 34010 1293 PROCEDURE rw_param( VAR parameter: integer ); 34020 1294 34030 1295 (********************************************************************************* 34040 1296 * description : Reads or updates a parameter according to the operation code 34050 1297 * and the update field. 34060 1298 * call value : parameter = parameter en question 34070 1299 * return value : parameter = updated if update is insert_code 34080 1300 * globals : none 34090 1301 *********************************************************************************) 34100 1302 34110 1303 BEGIN 34120 1304 1 ! 34130 1305 2 ! LOCK msg AS locvar: al_form_11__ DO 34140 1306 3 ! WITH locvar, locvar.al_label DO 34150 1307 4 ! IF ( send.macro <> dc_macro ) THEN 34160 1308 5 ! res:= forbidden 34170 1309 6 ! ELSE 34180 1310 7 ! 34190 1311 8 ! CASE update OF 34200 1312 9 ! ! 34210 1313 10 ! ! read_code: 34220 1314 11 ! ! BEGIN 34230 1315 12 ! ! ! 34240 1316 13 ! ! ! params( 1 ):= parameter; 34250 1317 14 ! ! ! no_of_by:= no_of_by + 2; 34260 1318 15 ! ! ! 34270 1319 16 ! ! END; 34280 1320 17 ! ! 34290 1321 18 ! ! insert_code: 34300 1322 19 ! ! IF ( msg^.u4 <> read_package_count ) THEN 34310 1323 20 ! ! parameter:= params( 1 ) 34320 1324 21 ! ! ELSE 34330 1325 22 ! ! res:= forbidden 34340 1326 23 ! ! ; 34350 1327 24 ! ! 34360 1328 25 ! ! OTHERWISE 34370 1329 26 ! ! res:= unknown_update 34380 1330 27 ! ! 34390 1331 28 ! END (* case update *) 34400 1332 29 ! 34410 1333 30 END; (* procedure rw_param *) 34420 1334 \f outlst 81.06.24. 17.09. page 43 35010 1335 BEGIN (* procedure exec_conn_operation *) 35020 1336 1 ! 35030 1337 2 ! <*t testout( z, "exec_conn_op", msg^.u4 ); t*> 35040 1338 3 ! 35050 1339 4 ! CASE msg^.u4 OF (* operation code *) 35060 1340 5 ! ! 35070 1341 6 ! ! reject_opc: 35080 1342 7 ! ! BEGIN 35090 1343 8 ! ! ! 35100 1344 9 ! ! ! return( msg ); 35110 1345 10 ! ! ! testout( z, "garb. return", msg^.u3 ) 35120 1346 11 ! ! ! 35130 1347 12 ! ! END; 35140 1348 13 ! ! 35150 1349 14 ! ! ts_newactivity: 35160 1350 15 ! ! LOCK msg AS locvar: al_form_0900 DO 35170 1351 16 ! ! WITH locvar, al_label DO 35180 1352 17 ! ! IF ( send.macro <> dc_macro ) AND ( send.micro <> ath_mic_addr ) THEN 35190 1353 18 ! ! res:= forbidden 35200 1354 19 ! ! ELSE 35210 1355 20 ! ! CASE update OF 35220 1356 21 ! ! ! 35230 1357 22 ! ! ! stop_code: 35240 1358 23 ! ! ! BEGIN 35250 1359 24 ! ! ! ! 35260 1360 25 ! ! ! ! IF NOT nil( alarm_msg ) THEN 35270 1361 26 ! ! ! ! WITH ac_tbl( actual_ac_index ) DO 35280 1362 27 ! ! ! ! finish_message( alarm_msg, data_incomplete, 35290 1363 28 ! ! ! ! (**) ( ac_tbl( pac_index ).sac_rac_ix <> sac_rac_ix ) ); 35300 1364 29 ! ! ! ! 35310 1365 30 ! ! ! ! IF nil( driver_msg ) THEN 35320 1366 31 ! ! ! ! conversation:= busy 35330 1367 32 ! ! ! ! ELSE 35340 1368 33 ! ! ! ! conversation:= idle; 35350 1369 34 ! ! ! ! 35360 1370 35 ! ! ! ! activity:= stop_code; 35370 1371 36 ! ! ! ! reject_code:= passivated 35380 1372 37 ! ! ! ! 35390 1373 38 ! ! ! END; 35400 1374 39 ! ! ! \f outlst 81.06.24. 17.09. page 44 36010 1375 40 ! ! ! start_code: 36020 1376 41 ! ! ! IF ( top_aac_index < pac_index ) THEN 36030 1377 42 ! ! ! res:= not_ready 36040 1378 43 ! ! ! ELSE 36050 1379 44 ! ! ! BEGIN 36060 1380 45 ! ! ! ! 36070 1381 46 ! ! ! ! t_e_counter:= t_e_c_init; 36080 1382 47 ! ! ! ! 36090 1383 48 ! ! ! ! compute_delay( frequence ); 36100 1384 49 ! ! ! ! 36110 1385 50 ! ! ! ! line_state:= low; 36120 1386 51 ! ! ! ! no_succ_t_e:= 0; 36130 1387 52 ! ! ! ! 36140 1388 53 ! ! ! ! activity:= start_code; 36150 1389 54 ! ! ! ! reject_code:= accepted; 36160 1390 55 ! ! ! ! 36170 1391 56 ! ! ! ! valid_response( busy ):= (.p_ack, au_alarm, addr, state, n_ack.); 36180 1392 57 ! ! ! ! valid_response( control ):= (.state, d_ack, n_ack.); 36190 1393 58 ! ! ! ! valid_response( testi ):= (.state, t_ack, n_ack.); 36200 1394 59 ! ! ! ! valid_response( teste ):= (.state, e_ack, n_ack.); 36210 1395 60 ! ! ! ! valid_response( coll_alarm1 ):= (.au_alarm, addr, state, n_ack.); 36220 1396 61 ! ! ! ! valid_response( coll_alarm2 ):= (.p_ack, au_alarm, addr, state, n_ack.); 36230 1397 62 ! ! ! ! 36240 1398 63 ! ! ! ! IF nil( driver_msg ) THEN 36250 1399 64 ! ! ! ! conversation:= busy 36260 1400 65 ! ! ! ! ELSE 36270 1401 66 ! ! ! ! conversation:= idle 36280 1402 67 ! ! ! ! 36290 1403 68 ! ! ! END; 36300 1404 69 ! ! ! \f outlst 81.06.24. 17.09. page 45 37010 1405 70 ! ! ! service_code: 37020 1406 71 ! ! ! BEGIN 37030 1407 72 ! ! ! ! 37040 1408 73 ! ! ! ! IF NOT nil( alarm_msg ) THEN 37050 1409 74 ! ! ! ! WITH ac_tbl( actual_ac_index ) DO 37060 1410 75 ! ! ! ! finish_message( alarm_msg, data_incomplete, 37070 1411 76 ! ! ! ! (**) ( ac_tbl( pac_index ).sac_rac_ix <> sac_rac_ix ) ); 37080 1412 77 ! ! ! ! 37090 1413 78 ! ! ! ! compute_delay( frequence ); 37100 1414 79 ! ! ! ! 37110 1415 80 ! ! ! ! activity:= service_code; 37120 1416 81 ! ! ! ! reject_code:= illegal_operation; 37130 1417 82 ! ! ! ! 37140 1418 83 ! ! ! ! valid_response( busy ):= (.p_ack, n_ack.); 37150 1419 84 ! ! ! ! valid_response( testi ):= (.t_ack, n_ack.); 37160 1420 85 ! ! ! ! 37170 1421 86 ! ! ! ! IF nil( driver_msg ) THEN 37180 1422 87 ! ! ! ! conversation:= busy 37190 1423 88 ! ! ! ! ELSE 37200 1424 89 ! ! ! ! conversation:= idle 37210 1425 90 ! ! ! ! 37220 1426 91 ! ! ! END; 37230 1427 92 ! ! ! 37240 1428 93 ! ! ! OTHERWISE 37250 1429 94 ! ! ! res:= unknown_update 37260 1430 95 ! ! ! 37270 1431 96 ! ! END; (* case update, lock msg *) 37280 1432 97 ! ! \f outlst 81.06.24. 17.09. page 46 38010 1433 98 ! ! connect_test: 38020 1434 99 ! ! connect_message( msg, dummy_alarm - receipt ) 38030 1435 100 ! ! ; 38040 1436 101 ! ! 38050 1437 102 ! ! dummy_alarm: 38060 1438 103 ! ! ; 38070 1439 104 ! ! 38080 1440 105 ! ! ( dummy_alarm + receipt ): 38090 1441 106 ! ! connect_message( msg, connect_test ) 38100 1442 107 ! ! ; 38110 1443 108 ! ! 38120 1444 109 ! ! upd_ac_table: 38130 1445 110 ! ! LOCK msg AS locvar: al_form_1000 DO 38140 1446 111 ! ! WITH locvar, ac_addr_tbl_e, al_label DO 38150 1447 112 ! ! IF ( send.macro <> dc_macro ) THEN 38160 1448 113 ! ! res:= forbidden 38170 1449 114 ! ! ELSE 38180 1450 115 ! ! CASE update OF (* change of ac address table *) 38190 1451 116 ! ! ! 38200 1452 117 ! ! ! read_code: 38210 1453 118 ! ! ! IF search_addr_code( addr_code, table_index ) THEN 38220 1454 119 ! ! ! ac_addr_tbl_e:= ac_tbl( table_index ) 38230 1455 120 ! ! ! ELSE 38240 1456 121 ! ! ! res:= not_found 38250 1457 122 ! ! ! ; 38260 1458 123 ! ! ! 38270 1459 124 ! ! ! insert_code: 38280 1460 125 ! ! ! IF search_addr_code( addr_code, table_index ) THEN (* modify *) 38290 1461 126 ! ! ! ac_tbl( table_index ):= ac_addr_tbl_e 38300 1462 127 ! ! ! ELSE 38310 1463 128 ! ! ! IF ( top_aac_index < ac_table_lth ) THEN (* insert*) 38320 1464 129 ! ! ! BEGIN 38330 1465 130 ! ! ! ! 38340 1466 131 ! ! ! ! top_aac_index:= top_aac_index + 1; 38350 1467 132 ! ! ! ! ac_tbl( top_aac_index ):= ac_addr_tbl_e 38360 1468 133 ! ! ! ! 38370 1469 134 ! ! ! END 38380 1470 135 ! ! ! ELSE 38390 1471 136 ! ! ! res:= no_room (* no room in ac address table *) 38400 1472 137 ! ! ! ; 38410 1473 138 ! ! ! \f outlst 81.06.24. 17.09. page 47 39010 1474 139 ! ! ! remove_code: (* delete aac *) 39020 1475 140 ! ! ! IF search_addr_code( addr_code, table_index ) THEN 39030 1476 141 ! ! ! IF ( table_index = pac_index ) THEN 39040 1477 142 ! ! ! res:= illegal_operation 39050 1478 143 ! ! ! ELSE 39060 1479 144 ! ! ! BEGIN 39070 1480 145 ! ! ! ! 39080 1481 146 ! ! ! ! top_aac_index:= top_aac_index - 1; 39090 1482 147 ! ! ! ! 39100 1483 148 ! ! ! ! IF ( actual_ac_index > table_index ) THEN 39110 1484 149 ! ! ! ! actual_ac_index:= actual_ac_index - 1 39120 1485 150 ! ! ! ! ELSE 39130 1486 151 ! ! ! ! IF ( actual_ac_index = table_index ) THEN 39140 1487 152 ! ! ! ! actual_ac_index:= pac_index; 39150 1488 153 ! ! ! ! 39160 1489 154 ! ! ! ! (* compress *) 39170 1490 155 ! ! ! ! FOR table_index:= table_index TO top_aac_index DO 39180 1491 156 ! ! ! ! ac_tbl( table_index ):= ac_tbl( table_index + 1 ) 39190 1492 157 ! ! ! ! 39200 1493 158 ! ! ! END 39210 1494 159 ! ! ! ELSE 39220 1495 160 ! ! ! res:= not_found (* ac not found *) 39230 1496 161 ! ! ! ; 39240 1497 162 ! ! ! 39250 1498 163 ! ! ! OTHERWISE 39260 1499 164 ! ! ! res:= unknown_update 39270 1500 165 ! ! ! 39280 1501 166 ! ! END; (* case update, lock msg *) 39290 1502 167 ! ! \f outlst 81.06.24. 17.09. page 48 40010 1503 168 ! ! r_w_tec: 40020 1504 169 ! ! rw_param( t_e_counter ) 40030 1505 170 ! ! ; 40040 1506 171 ! ! 40050 1507 172 ! ! read_package_count: 40060 1508 173 ! ! rw_param( package_count ) 40070 1509 174 ! ! ; 40080 1510 175 ! ! 40090 1511 176 ! ! r_w_service_limit: 40100 1512 177 ! ! rw_param( service_limit ) 40110 1513 178 ! ! ; 40120 1514 179 ! ! 40130 1515 180 ! ! r_w_s_a_limit: 40140 1516 181 ! ! rw_param( s_a_limit ) 40150 1517 182 ! ! ; 40160 1518 183 ! ! 40170 1519 184 ! ! r_w_max_succ_t_e: 40180 1520 185 ! ! rw_param( max_succ_t_e ) 40190 1521 186 ! ! ; 40200 1522 187 ! ! 40210 1523 188 ! ! <*p 40220 1524 189 ! ! node_test: 40230 1525 190 ! ! BEGIN 40240 1526 191 ! ! 40250 1527 192 ! ! return( msg ); 40260 1528 193 ! ! 40270 1529 194 ! ! IF ( activity = stop_code ) THEN 40280 1530 195 ! ! IF NOT nil( driver_msg ) THEN 40290 1531 196 ! ! create_channel 40300 1532 197 ! ! ELSE (* OBS!!! *) 40310 1533 198 ! ! ELSE (* OBS!!! *) 40320 1534 199 ! ! 40330 1535 200 ! ! END 40340 1536 201 ! ! ; 40350 1537 202 ! ! p*> 40360 1538 203 ! ! 40370 1539 204 ! ! OTHERWISE 40380 1540 205 ! ! reject_message( msg, ath_sem, route_vect( msg^.u3 ), ts_macro, own_addr, unknown_opcode ) 40390 1541 206 ! ! 40400 1542 207 ! END; (* case operation code *) 40410 1543 208 ! 40420 1544 209 ! IF NOT nil( msg ) THEN 40430 1545 210 ! receipt_message( msg, ath_sem, route_vect( msg^.u3 ), 0, res ) 40440 1546 211 ! 40450 1547 212 END; (* procedure exec_conn_operation *) 40460 1548 \f outlst 81.06.24. 17.09. page 49 41010 1549 <*p 41020 1550 PROCEDURE supervise; 41030 1551 41040 1552 BEGIN 41050 1553 41060 1554 IF ( traffic_counter > ( abs( node_test_frequency ) + delay ) ) THEN 41070 1555 BEGIN (* ATH didn't clear traffic_counter in time *) 41080 1556 41090 1557 activity:= stop_code; 41100 1558 41110 1559 reject_code:= no_connection; 41120 1560 41130 1561 (* OBS!!! 41140 1562 . handle_queue will clean up ath_msg and queue_sem when called with 41150 1563 . no_connection. Modifying runtimeset in this way mskes it impossible 41160 1564 . to get back to the original situation. 41170 1565 . outstanding: 41180 1566 .... a feasible reaction in this situation: 41190 1567 ...... stop poll ? 41200 1568 ...... modify runtimeset ? 41210 1569 ...... tell who ? 41220 1570 ...... recovery when/if ATH comes up with traffic_counter = 0 41230 1571 ...... does ATC find out ? 41240 1572 *) 41250 1573 41260 1574 END 41270 1575 ELSE 41280 1576 traffic_counter:= traffic_counter + delay 41290 1577 41300 1578 END; (* procedure supervise *) 41310 1579 p*> 41320 1580 \f outlst 81.06.24. 17.09. page 50 42010 1581 PROCEDURE finish_conversation; 42020 1582 42030 1583 (********************************************************************************* 42040 1584 * description : Takes the appropriate action in relation to a received 42050 1585 * response from DRIVER (AT) 42060 1586 * globals : alarm_msg = nil or holding a message 42070 1587 * driver_mes = nil or holding driver message 42080 1588 * reject_code = updated 42090 1589 * conversation = updated 42100 1590 * ac_tbl = unchanged 42110 1591 * actual_ac_index = updated 42120 1592 * state_bit = updated 42130 1593 *********************************************************************************) 42140 1594 42150 1595 BEGIN 42160 1596 1 ! 42170 1597 2 ! IF ( t_e_kind <> no_error ) THEN 42180 1598 3 ! 42190 1599 4 ! CASE conversation OF 42200 1600 5 ! ! 42210 1601 6 ! ! busy: 42220 1602 7 ! ! conversation:= idle; 42230 1603 8 ! ! 42240 1604 9 ! ! testi, teste, control, coll_alarm1, coll_alarm2: 42250 1605 10 ! ! IF ( no_succ_t_e < max_succ_t_e ) THEN 42260 1606 11 ! ! (* try to get through with the last telegram *) 42270 1607 12 ! ! send_telegram( dummy, dummy, ( ( no_succ_t_e > 1 ) AND ( t_e_kind = ill_opc ) ), 42280 1608 13 ! ! (**) ( t_e_kind <> no_error ) ) 42290 1609 14 ! ! ELSE 42300 1610 15 ! ! BEGIN 42310 1611 16 ! ! ! 42320 1612 17 ! ! ! IF NOT nil( alarm_msg ) THEN 42330 1613 18 ! ! ! WITH ac_tbl( actual_ac_index ) DO 42340 1614 19 ! ! ! finish_message( alarm_msg, data_incomplete, 42350 1615 20 ! ! ! (**) ( ac_tbl( pac_index ).sac_rac_ix <> sac_rac_ix ) ); 42360 1616 21 ! ! ! 42370 1617 22 ! ! ! IF NOT nil( ath_msg ) THEN 42380 1618 23 ! ! ! WITH ath_msg^ DO 42390 1619 24 ! ! ! receipt_message( ath_msg, ath_sem, route_vect( u3 ), u2 - u1, data_incomplete ); 42400 1620 25 ! ! ! 42410 1621 26 ! ! ! conversation:= idle 42420 1622 27 ! ! ! 42430 1623 28 ! ! END; 42440 1624 29 ! ! 42450 1625 30 ! ! OTHERWISE 42460 1626 31 ! ! \f outlst 81.06.24. 17.09. page 51 42470 1627 32 ! END (* case conversation *) 42480 1628 33 ! ELSE 42490 1629 34 ! \f outlst 81.06.24. 17.09. page 52 43010 1630 35 ! (* not transmission error *) 43020 1631 36 ! 43030 1632 37 ! CASE at_op_code OF 43040 1633 38 ! ! 43050 1634 39 ! ! p_ack: 43060 1635 40 ! ! conversation:= idle; 43070 1636 41 ! ! 43080 1637 42 ! ! au_alarm: 43090 1638 43 ! ! WITH ac_tbl( actual_ac_index ) DO 43100 1639 44 ! ! IF nil( alarm_msg ) THEN 43110 1640 45 ! ! IF get_message( alarm_msg, au_alarm_opc, block_lth, 43120 1641 46 ! ! dummy_macro, dummy, sac_rac_ix ) THEN 43130 1642 47 ! ! BEGIN 43140 1643 48 ! ! ! 43150 1644 49 ! ! ! IF ready_byte_msg( alarm_msg, at_data ) THEN 43160 1645 50 ! ! ! BEGIN (* au alarm is collected *) 43170 1646 51 ! ! ! ! 43180 1647 52 ! ! ! ! WITH ac_tbl( actual_ac_index ) DO 43190 1648 53 ! ! ! ! finish_message( alarm_msg, accepted, 43200 1649 54 ! ! ! ! (**) ( ac_tbl( pac_index ).sac_rac_ix <> sac_rac_ix ) ); 43210 1650 55 ! ! ! ! 43220 1651 56 ! ! ! ! IF ( conversation = coll_alarm2 ) THEN 43230 1652 57 ! ! ! ! conversation:= idle 43240 1653 58 ! ! ! ! ELSE 43250 1654 59 ! ! ! ! BEGIN (* poll immediately *) 43260 1655 60 ! ! ! ! ! 43270 1656 61 ! ! ! ! ! conversation:= coll_alarm2; 43280 1657 62 ! ! ! ! ! send_telegram( poll_opc, poll_byte, 43290 1658 63 ! ! ! ! ! (**) ( t_e_kind = ill_opc ), ( t_e_kind <> no_error ) ) 43300 1659 64 ! ! ! ! ! 43310 1660 65 ! ! ! ! END 43320 1661 66 ! ! ! ! 43330 1662 67 ! ! ! END 43340 1663 68 ! ! ! ELSE 43350 1664 69 ! ! ! BEGIN (* collect multi byte alarm *) 43360 1665 70 ! ! ! ! 43370 1666 71 ! ! ! ! IF ( conversation <> coll_alarm2 ) THEN 43380 1667 72 ! ! ! ! conversation:= coll_alarm1; 43390 1668 73 ! ! ! ! 43400 1669 74 ! ! ! ! send_telegram( poll_opc, poll_byte, 43410 1670 75 ! ! ! ! (**) ( t_e_kind = ill_opc ), ( t_e_kind <> no_error ) ) 43420 1671 76 ! ! ! ! 43430 1672 77 ! ! ! END 43440 1673 78 ! ! ! 43450 1674 79 ! ! END 43460 1675 80 ! ! ELSE \f outlst 81.06.24. 17.09. page 53 43470 1676 81 ! ! conversation:= idle 43480 1677 82 ! ! ; 43490 1678 83 ! ! \f outlst 81.06.24. 17.09. page 54 44010 1679 84 ! ! addr: 44020 1680 85 ! ! BEGIN 44030 1681 86 ! ! ! 44040 1682 87 ! ! ! IF NOT nil( alarm_msg ) THEN (* finish not completed alarm *) 44050 1683 88 ! ! ! WITH ac_tbl( actual_ac_index ) DO 44060 1684 89 ! ! ! finish_message( alarm_msg, data_incomplete, 44070 1685 90 ! ! ! (**) ( ac_tbl( pac_index ).sac_rac_ix <> sac_rac_ix ) ) 44080 1686 91 ! ! ! ; 44090 1687 92 ! ! ! 44100 1688 93 ! ! ! IF NOT search_addr_code( at_data, actual_ac_index ) THEN (* troubles with block_lth !!! *) 44110 1689 94 ! ! ! actual_ac_index:= pac_index; 44120 1690 95 ! ! ! 44130 1691 96 ! ! ! WITH ac_tbl( actual_ac_index ) DO 44140 1692 97 ! ! ! IF get_message( alarm_msg, au_alarm_opc, block_lth, 44150 1693 98 ! ! ! dummy_macro, dummy, sac_rac_ix ) THEN 44160 1694 99 ! ! ! (* send a poll immediately *) 44170 1695 100 ! ! ! BEGIN 44180 1696 101 ! ! ! ! 44190 1697 102 ! ! ! ! conversation:= coll_alarm1; 44200 1698 103 ! ! ! ! send_telegram( poll_opc, poll_byte, 44210 1699 104 ! ! ! ! (**) ( t_e_kind = ill_opc ), ( t_e_kind <> no_error ) ) 44220 1700 105 ! ! ! ! 44230 1701 106 ! ! ! END 44240 1702 107 ! ! ! ELSE 44250 1703 108 ! ! ! conversation:= idle 44260 1704 109 ! ! ! 44270 1705 110 ! ! END; 44280 1706 111 ! ! \f outlst 81.06.24. 17.09. page 55 45010 1707 112 ! ! state: 45020 1708 113 ! ! BEGIN 45030 1709 114 ! ! ! 45040 1710 115 ! ! ! IF NOT nil( alarm_msg ) THEN (* finish not completed alarm *) 45050 1711 116 ! ! ! WITH ac_tbl( actual_ac_index ) DO 45060 1712 117 ! ! ! finish_message( alarm_msg, data_incomplete, 45070 1713 118 ! ! ! (**) ( ac_tbl( pac_index ).sac_rac_ix <> sac_rac_ix ) ) 45080 1714 119 ! ! ! ; 45090 1715 120 ! ! ! 45100 1716 121 ! ! ! WITH ac_tbl( pac_index ) DO 45110 1717 122 ! ! ! IF get_message( alarm_msg, state_alarm, 1, dummy_macro, dummy, sac_rac_ix ) THEN 45120 1718 123 ! ! ! IF ready_byte_msg( alarm_msg, at_data ) THEN 45130 1719 124 ! ! ! finish_message( alarm_msg, accepted, override ) 45140 1720 125 ! ! ! ; 45150 1721 126 ! ! ! 45160 1722 127 ! ! ! LOCK driver_msg AS locvar: state_byte DO 45170 1723 128 ! ! ! BEGIN 45180 1724 129 ! ! ! ! 45190 1725 130 ! ! ! ! IF ( locvar >= (.batt_limit, batt_supply.) ) THEN 45200 1726 131 ! ! ! ! reject_code:= state_power_error 45210 1727 132 ! ! ! ! ELSE 45220 1728 133 ! ! ! ! IF ( serif_error IN locvar ) THEN 45230 1729 134 ! ! ! ! reject_code:= state_serif_error 45240 1730 135 ! ! ! ! ELSE 45250 1731 136 ! ! ! ! IF ( au_error IN locvar ) THEN 45260 1732 137 ! ! ! ! reject_code:= state_au_error 45270 1733 138 ! ! ! ! ELSE 45280 1734 139 ! ! ! ! IF ( hs_error IN locvar ) THEN 45290 1735 140 ! ! ! ! reject_code:= state_hs_error 45300 1736 141 ! ! ! ! ELSE 45310 1737 142 ! ! ! ! reject_code:= accepted 45320 1738 143 ! ! ! ! 45330 1739 144 ! ! ! END; (* lock driver_msg *) 45340 1740 145 ! ! ! 45350 1741 146 ! ! ! conversation:= idle 45360 1742 147 ! ! ! 45370 1743 148 ! ! END; 45380 1744 149 ! ! \f outlst 81.06.24. 17.09. page 56 46010 1745 150 ! ! d_ack, 46020 1746 151 ! ! t_ack, 46030 1747 152 ! ! e_ack: 46040 1748 153 ! ! WITH ath_msg^ DO 46050 1749 154 ! ! IF ready_byte_msg( ath_msg, at_data ) THEN 46060 1750 155 ! ! (* send result of control, testi1, testi2, teste to ATH *) 46070 1751 156 ! ! BEGIN 46080 1752 157 ! ! ! 46090 1753 158 ! ! ! receipt_message( ath_msg, ath_sem, route_vect( u3 ), 0, accepted ); 46100 1754 159 ! ! ! 46110 1755 160 ! ! ! conversation:= idle 46120 1756 161 ! ! ! 46130 1757 162 ! ! END 46140 1758 163 ! ! ELSE 46150 1759 164 ! ! (* multi byte control/test: send the next data_byte *) 46160 1760 165 ! ! LOCK ath_msg AS locvar: al_form_byte DO 46170 1761 166 ! ! WITH last_telegram, locvar, al_label DO 46180 1762 167 ! ! send_telegram( atc_opc, data( u2 + 1 ), 46190 1763 168 ! ! (**) ( t_e_kind = ill_opc ), ( t_e_kind <> no_error ) ) 46200 1764 169 ! ! ; (* end lock ath_msg *) 46210 1765 170 ! ! 46220 1766 171 ! ! OTHERWISE 46230 1767 172 ! ! 46240 1768 173 ! END (* case at_op_code *) 46250 1769 174 ! 46260 1770 175 END; (* procedure finish_conversation *) 46270 1771 \f outlst 81.06.24. 17.09. page 57 47010 1772 PROCEDURE restrict_protocol; 47020 1773 47030 1774 (********************************************************************************* 47040 1775 * description : Handles the situation, where ATC isn't allowed to 47050 1776 * communicate with the AT. 47060 1777 * The reason being either: 47070 1778 * initiating or stop activity ordered from DC. 47080 1779 * globals : all globals may be used 47090 1780 *********************************************************************************) 47100 1781 47110 1782 BEGIN 47120 1783 1 ! 47130 1784 2 ! REPEAT 47140 1785 3 ! ! 47150 1786 4 ! ! handle_queue( ath_msg, reject_code ); 47160 1787 5 ! ! 47170 1788 6 ! ! wait( atc_msg, main_sem.w^ ); 47180 1789 7 ! ! 47190 1790 8 ! ! IF ownertest( delay_pool, atc_msg ) THEN 47200 1791 9 ! ! delay_msg :=: atc_msg (* hold the message *) 47210 1792 10 ! ! ELSE 47220 1793 11 ! ! CASE atc_msg^.u3 OF 47230 1794 12 ! ! ! (* message origin *) 47240 1795 13 ! ! ! 47250 1796 14 ! ! ! dummy_route: 47260 1797 15 ! ! ! return( atc_msg ); 47270 1798 16 ! ! ! 47280 1799 17 ! ! ! netc_route, 47290 1800 18 ! ! ! netc_route1: (* message from ATH *) 47300 1801 19 ! ! ! IF atc_msg^.u4 IN (.ts_cntrl, group_cntrl, ts_testi1, ts_testi2, ts_teste.) THEN 47310 1802 20 ! ! ! signal( atc_msg, queue_sem.w^ ) 47320 1803 21 ! ! ! ELSE (* execute the operations that doesn't involve DRIVER *) 47330 1804 22 ! ! ! exec_conn_operation( atc_msg ); 47340 1805 23 ! ! ! \f outlst 81.06.24. 17.09. page 58 48010 1806 24 ! ! ! at_route: (* message from DRIVER *) 48020 1807 25 ! ! ! BEGIN 48030 1808 26 ! ! ! ! 48040 1809 27 ! ! ! ! driver_msg :=: atc_msg; (* hold message *) 48050 1810 28 ! ! ! ! 48060 1811 29 ! ! ! ! conversation:= idle; 48070 1812 30 ! ! ! ! 48080 1813 31 ! ! ! ! WITH driver_msg^ DO 48090 1814 32 ! ! ! ! IF ( u1 = create_at_ch ) AND ( u2 <> create_done ) THEN (* OBS!!! *) 48100 1815 33 ! ! ! ! ; 48110 1816 34 ! ! ! ! 48120 1817 35 ! ! ! ! <*p 48130 1818 36 ! ! ! ! supervise 48140 1819 37 ! ! ! ! p*> 48150 1820 38 ! ! ! ! 48160 1821 39 ! ! ! END; 48170 1822 40 ! ! ! 48180 1823 41 ! ! ! OTHERWISE (* unknown route *) 48190 1824 42 ! ! ! reject_message( atc_msg, ath_sem, at_route, ts_macro, own_addr, unknown_route ) 48200 1825 43 ! ! ! 48210 1826 44 ! ! END (* case message origin *) 48220 1827 45 ! ! 48230 1828 46 ! UNTIL ( top_aac_index > 0 ) AND ( activity <> stop_code ) 48240 1829 47 ! 48250 1830 48 END; (* procedure restrict_protocol *) 48260 1831 \f outlst 81.06.24. 17.09. page 59 49010 1832 <*p 49020 1833 PROCEDURE exception( excode: integer ); 49030 1834 49040 1835 BEGIN 49050 1836 trace( excode ); 49060 1837 49070 1838 IF NOT nil( alarm_msg ) THEN 49080 1839 WITH ac_tbl( actual_ac_index ) DO 49090 1840 finish_message( alarm_msg, data_incomplete, 49100 1841 (**) ( ac_tbl( pac_index ).sac_rac_ix <> sac_rac_ix ) ); 49110 1842 49120 1843 reject_code:= breaked; 49130 1844 49140 1845 REPEAT 49150 1846 49160 1847 handle_queue( ath_msg, reject_code ); 49170 1848 49180 1849 wait( atc_msg, main_sem.w^ ); 49190 1850 49200 1851 IF ownertest( delay_pool, atc_msg ) THEN 49210 1852 delay_msg :=: atc_msg 49220 1853 ELSE 49230 1854 WITH atc_msg^ DO 49240 1855 CASE u3 OF (* route *) 49250 1856 49260 1857 dummy_route: 49270 1858 return( atc_msg ) 49280 1859 ; 49290 1860 49300 1861 netc_route, 49310 1862 netc_route1: 49320 1863 BEGIN 49330 1864 49340 1865 IF u4 IN (.ts_cntrl, group_cntrl, ts_testi1, ts_testi2, ts_teste.) THEN 49350 1866 signal( atc_msg, queue_sem.s^ ) 49360 1867 ELSE 49370 1868 IF ( u4 <> break_proc_end ) THEN 49380 1869 exec_conn_operation( atc_msg ) 49390 1870 49400 1871 END 49410 1872 ; 49420 1873 49430 1874 at_route: 49440 1875 driver_msg :=: atc_msg 49450 1876 ; 49460 1877 \f outlst 81.06.24. 17.09. page 60 49470 1878 OTHERWISE 49480 1879 reject_message( atc_msg, ath_sem, at_route, ts_macro, own_addr, unknown_route ) 49490 1880 49500 1881 END 49510 1882 49520 1883 UNTIL NOT nil( atc_msg ); (* break_proc_end received *) 49530 1884 49540 1885 receipt_message( atc_msg, ath_sem, route_vect( atc_msg^.u3 ), 0, accepted ) 49550 1886 49560 1887 END; (* procedure exception *) 49570 1888 p*> 49580 1889 \f outlst 81.06.24. 17.09. page 61 50010 1890 (********************************************************************************* 50020 1891 * 50030 1892 * AT CONNECTOR : MAIN 50040 1893 * 50050 1894 *********************************************************************************) 50060 1895 50070 1896 BEGIN 50080 1897 1 ! 50090 1898 2 ! testopen( z, own.incname, op_sem ); 50100 1899 3 ! 50110 1900 4 ! testout( z, version , ts_env_vers ); 50120 1901 5 ! testout( z, "chann/addr ", ( ( channel_no * 1000 ) + own_addr ) ); 50130 1902 6 ! 50140 1903 7 ! (********************************************************************************* 50150 1904 8 ! * Set up and send a buffer create channel to DRIVER 50160 1905 9 ! *********************************************************************************) 50170 1906 10 ! 50180 1907 11 ! alloc( driver_msg, driver_pool, main_sem.s^ ); 50190 1908 12 ! 50200 1909 13 ! create_channel; 50210 1910 14 ! 50220 1911 15 ! (******************************************************************************** 50230 1912 16 ! * Allocate TIMER message with main_sem as answer- and delay_pool semaphore 50240 1913 17 ! * as owner-semaphore 50250 1914 18 ! ********************************************************************************) 50260 1915 19 ! 50270 1916 20 ! alloc( delay_msg, delay_pool, main_sem.s^ ); 50280 1917 21 ! 50290 1918 22 ! (******************************************************************************** 50300 1919 23 ! * Start initialisation sequence 50310 1920 24 ! ********************************************************************************) 50320 1921 25 ! 50330 1922 26 ! restrict_protocol; 50340 1923 27 ! 50350 1924 28 ! (******************************************************************************** 50360 1925 29 ! * End of initialization sequence 50370 1926 30 ! ********************************************************************************) 50380 1927 31 ! 50390 1928 32 ! <*t testout( z, "end init ", ord( conversation ) ); t*> 50400 1929 33 ! \f outlst 81.06.24. 17.09. page 62 51010 1930 34 ! REPEAT 51020 1931 35 ! ! (* forever........................................................................ *) 51030 1932 36 ! ! 51040 1933 37 ! ! IF ( conversation = idle ) THEN 51050 1934 38 ! ! BEGIN 51060 1935 39 ! ! ! 51070 1936 40 ! ! ! handle_queue( ath_msg, reject_code ); 51080 1937 41 ! ! ! 51090 1938 42 ! ! ! IF NOT nil( ath_msg ) THEN 51100 1939 43 ! ! ! (* repeat a interrupted conversation or start a queued one *) 51110 1940 44 ! ! ! initiate_conversation( ath_msg ) 51120 1941 45 ! ! ! ELSE 51130 1942 46 ! ! ! IF NOT nil( delay_msg ) THEN 51140 1943 47 ! ! ! BEGIN 51150 1944 48 ! ! ! ! 51160 1945 49 ! ! ! ! conversation:= busy; 51170 1946 50 ! ! ! ! send_telegram( poll_opc, poll_byte, 51180 1947 51 ! ! ! ! (**) ( t_e_kind = ill_opc ), ( t_e_kind <> no_error ) ) 51190 1948 52 ! ! ! ! 51200 1949 53 ! ! ! END 51210 1950 54 ! ! ! 51220 1951 55 ! ! END; 51230 1952 56 ! ! \f outlst 81.06.24. 17.09. page 63 52010 1953 57 ! ! wait( atc_msg, main_sem.w^ ); 52020 1954 58 ! ! 52030 1955 59 ! ! IF ownertest( delay_pool, atc_msg ) THEN 52040 1956 60 ! ! delay_msg :=: atc_msg (* hold the message *) 52050 1957 61 ! ! ELSE 52060 1958 62 ! ! CASE atc_msg^.u3 OF (* message origin *) 52070 1959 63 ! ! ! 52080 1960 64 ! ! ! dummy_route: 52090 1961 65 ! ! ! return( atc_msg ); 52100 1962 66 ! ! ! 52110 1963 67 ! ! ! netc_route, 52120 1964 68 ! ! ! netc_route1: (* message from ATH *) 52130 1965 69 ! ! ! IF atc_msg^.u4 IN (.ts_cntrl, group_cntrl, ts_testi1, ts_testi2, ts_teste.) THEN 52140 1966 70 ! ! ! signal( atc_msg, queue_sem.s^ ) 52150 1967 71 ! ! ! ELSE 52160 1968 72 ! ! ! (* always execute the operations that does not involve DRIVER *) 52170 1969 73 ! ! ! BEGIN 52180 1970 74 ! ! ! ! 52190 1971 75 ! ! ! ! exec_conn_operation( atc_msg ); 52200 1972 76 ! ! ! ! 52210 1973 77 ! ! ! ! IF ( activity = stop_code ) THEN 52220 1974 78 ! ! ! ! restrict_protocol 52230 1975 79 ! ! ! ! 52240 1976 80 ! ! ! END 52250 1977 81 ! ! ! ; 52260 1978 82 ! ! ! \f outlst 81.06.24. 17.09. page 64 53010 1979 83 ! ! ! at_route: (* response message from DRIVER *) 53020 1980 84 ! ! ! BEGIN 53030 1981 85 ! ! ! ! 53040 1982 86 ! ! ! ! driver_msg :=: atc_msg; (* hold message *) 53050 1983 87 ! ! ! ! 53060 1984 88 ! ! ! ! transm_cntrl( at_op_code, at_data, valid_response( conversation ) ); 53070 1985 89 ! ! ! ! finish_conversation; 53080 1986 90 ! ! ! ! 53090 1987 91 ! ! ! ! <*p 53100 1988 92 ! ! ! ! supervise; 53110 1989 93 ! ! ! ! 53120 1990 94 ! ! ! ! IF ( activity = stop_code ) THEN 53130 1991 95 ! ! ! ! restrict_protocol 53140 1992 96 ! ! ! ! p*> 53150 1993 97 ! ! ! ! 53160 1994 98 ! ! ! END 53170 1995 99 ! ! ! ; 53180 1996 100 ! ! ! 53190 1997 101 ! ! ! OTHERWISE (* unknown route *) 53200 1998 102 ! ! ! reject_message( atc_msg, ath_sem, at_route, ts_macro, own_addr, unknown_route ) 53210 1999 103 ! ! ! 53220 2000 104 ! ! END (* case message origin *) 53230 2001 105 ! ! 53240 2002 106 ! UNTIL forever; 53250 2003 107 ! 53260 2004 108 END. (* process atconnector*) 53270 2005 53280 2006 \f outlst 81.06.24. 17.09. page 65 0 239* 245* 246* 256* 260* 260* 260* 270* 285* 295* 371* 418* 443* 446* 449* 454* 455* 538 668 678 685 738 748 852 876 912 939 1063 1074 1152 1212 1214 1269 1386 1545 1753 1828 1 220* 221* 240* 247* 271* 296* 446* 539 659 803 853 859 877 910 937 989 1052 1161 1179 1180 1201 1275 1285 1316 1323 1466 1481 1484 1491 1607 1717 1762 2 241* 272* 297* 1274 1284 1317 3 242* 273* 298* 4 274* 299* 880 5 275* 300* 6 276* 301* 7 277* 302* 31 256* 285* 1000 1901 aac_address 871 accepted 663: 991 1072 1140* 1211 1231* 1389 1648 1719 1737 1753 activity 14* 987 1054 1070 1370= 1388= 1415= 1828 1973 actual_ac_index <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 370* 874 1361 1409 1483 1484= 1484 1486 1487= 1613 1638 1647 1683 1688 1689= 1691 1711 ac_address_table <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 368* ac_addr_tbl_e <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1446 1454= 1461 1467 ac_index 706* 748 ac_table_lth 1463 ac_table_range <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 370* 890* 918* 1141* 1232* ac_tbl 368* 866 874 909 912 936 939 988 1155 1361 1363 1409 1411 1454 1461= 1467= 1491= 1491 1613 1615 1638 1647 1649 1683 1685 1691 1711 1713 1716 addr 273* 1391 1395 1396 1679: addr_code 909 912 1453 1460 1475 alarmlabel 733 alarmnetaddr 1237* alarm_bytes 835* 854= 878 alarm_msg 228* 1360 1362 1408 1410 1612 1614 1639 1640 1644 1648 1682 1684 1692 1710 1712 1717 1718 1719 alloc 1907 1916 al_form_0001 870 al_form_0900 1350 al_form_0902 1241 al_form_1000 1445 al_form_11__ 1305 al_form_byte 796 840 1145 1760 \f outlst 81.06.24. 17.09. page 66 al_label 797 841 871 1146 1242 1306 1351 1446 1761 al_net_addr 1248 1249= as 530: 575: 593: 598: 733: 796: 840: 870: 1003: 1145: 1241: 1305: 1350: 1445: 1722: 1760: atconnector 1* atc_cntrl 240* 1161 atc_format 252* 260* 260* 575 593 598 atc_msg 229* 1788 1790 1791 1793 1797 1801 1802 1804 1809 1824 1953 1955 1956 1958 1961 1965 1966 1971 1982 1998 atc_opc 254* 584= 1762 atc_op_codes 250* 254* 550* atc_teste 242* 250* 1201 atc_testi 241* 1185 1189 ath_mic_addr 1352 ath_msg 226* 757 1617 1618 1619 1748 1749 1753 1760: 1786 1936 1938 1940 ath_sem 9* 668 678 685 863 1212 1540 1545 1619 1753 1824 1998 at_control 538 at_data 455* 945* 1015= 1644 1688 1718 1749 1984 at_format 282* 1003 at_opc 284* 1007 1010 1014 at_op_code 454* 944* 1014= 1632 1984 at_op_codes 280* 284* 399* 454* 944* at_route 441* 536 739 1806: 1824 1979: 1998 at_route1 441* at_time_out 296* au_alarm 272* 1391 1395 1396 1637: au_alarm_opc 324* 858 1640 1692 au_error 298* 1731 a_delay 753: a_semaphore 732: batt_limit 301* 1725 batt_supply 302* 305* 1725 bit_error 405* 1001 block_lth 703* 737 836* 850= 852 853 867 876 877 880 1640 1692 boolean 255* 553* 707* 780* 818* 890* 918* breaked 675: break_proc_end <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 360* busy 381* 420* 543 1366 1391 1399 1418 1422 1601: 1945 byte 27* 253* 283* 438* 446* 452* 455* 551* 703* 779* 836* 890* 945* 971* 1234* call 1052 1086 1103 channel_error <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 407* 1030 channel_no 27* 535 620 1901 \f outlst 81.06.24. 17.09. page 67 check 1000 check5 596 1000 checkbits 256* 285* coll_alarm1 385* 1395 1604: 1667 1697 coll_alarm2 386* 420* 1396 1604: 1651 1656 1666 compute_delay <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1255* 1383 1413 com_pool 11* 730 connector_state <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 14* connect_message <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1234* 1434 1441 connect_test 342* 1433: 1441 control 382* 1160 1392 1604: conversation 391* 543= 1160= 1182= 1200= 1366= 1368= 1399= 1401= 1422= 1424= 1599 1602= 1621= 1635= 1651 1652= 1656= 1666 1667= 1676= 1697= 1703= 1741= 1755= 1811= 1933 1945= 1984 con_lam_time 539 create_at_ch 534 1814 create_channel <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 519* 1909 create_ch_format <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 446* 530 create_done 1814 data 804= 854 878= 971* 990 1161 1201 1762 data_byte 551* 586 779* 804 data_bytes 835* data_incomplete <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1362 1410 1614 1619 1684 1712 dc_erh_mic_addr <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 989 dc_macro 24* 989 1174 1307 1352 1447 definetimer 726 770 delay 16* 1267= delay3 452* 609 1289= delay4 452* 610 1269= 1275= 1275 1285= 1285 delay_msg 225* 605 606 612 1791= 1916 1942 1956= delay_pool 221* 1790 1916 1955 driver_msg 227* 530: 531 545 575: 593: 596 598: 616 624 997 1000 1003: 1027 1365 1398 1421 1722: 1809= 1813 1907 1982= driver_pool 220* 1907 driver_sem 10* 545 624 dummy 443* 867 1607 1607 1641 1693 1717 dummy_alarm 358* 1434 1437: 1440 dummy_macro 867 1641 1693 1717 \f outlst 81.06.24. 17.09. page 68 dummy_route 653 1796: 1960: d_ack 274* 1392 1745: exec_conn_operation <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1218* 1804 1971 e_ack 276* 1394 1747: false 260* 442* 770 1000 finish_conversation <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1581* 1985 finish_message <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 814* 884 991 1362 1410 1614 1648 1684 1712 1719 forbidden 1175 1308 1325 1353 1448 forever 2002 frequence 1383 1413 generate 596 get_message 699* 772= 867 989 1640 1692 1717 group_cntrl 332* 658 684 1151: 1801 1965 h01 318* h12 321* h30 324* h31 325* h32 326* h34 327* h35 328* h40 331* h44 332* h80 335* h82 336* h84 337* h90 340* h92 342* ha0 345* handle_queue 628* 757 1786 1936 hb2 351* hb4 348* hb6 352* hba 353* hbc 354* hc0 356* hc8 358* hce 360* hs_error 297* 1734 idle 380* 391* 1368 1401 1424 1602 1621 1635 1652 1676 1703 1741 1755 1811 1933 illegal_operation <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 681: 1416 1477 \f outlst 81.06.24. 17.09. page 69 ill_opc 406* 1019 1162 1186 1190 1202 1607 1658 1670 1699 1763 1947 incname 1898 initiate_conversation <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1125* 1940 insert_code 1321: 1459: integer 16* 26* 220* 410* 412* 413* 414* 418* 449* 706* 918* 1255* 1293* in_data 283* 1015 label_size 844 1158 1198 last_telegram <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 260* 576 578 594 599= 1761 line_alarm 325* 858 1051 1068 line_state 424* 1080 1087= 1096= 1104= 1113= 1385= lock 530: 575: 593: 598: 733: 796: 840: 870: 1003: 1145: 1241: 1305: 1350: 1445: 1722: 1760: locvar 530: 538= 539= 575: 576= 593: 594= 598: 599 733: 734 796: 797 840: 841 841 870: 871 1003: 1004 1145: 1146 1241: 1242 1305: 1306 1306 1350: 1351 1445: 1446 1722: 1725 1728 1731 1734 1760: 1761 log_to_pac 818* 847 865 884 low 425* 427* 1082: 1096 1385 macro 742= 745= 1174 1307 1352 1447 macroaddr 25* 704* main_sem 4* 1788 1907 1916 1953 max_byte 1281 max_int 659 859 1046 1271 max_succ_lin_err <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 414* max_succ_t_e 414* 1048 1065 1520 1605 micro 743= 746= 874= 1352 msg 630* 646 649 650 652 654 668 678 685 695 701* 730 733: 734 768 772 778* 796: 797 816* 840: 841 863 867 870: 871 884 983* 989 990 991 1218* 1234* 1241: 1242 1305: 1322 1339 1344 1345 1350: 1434 1441 1445: 1540 1540 1544 1545 1545 netc_route 438* 1799: 1963: netc_route1 438* 1800: 1964: new_opc 550* 584 new_serial_no <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 552* 574 590 node_test 356* not_ack 404* 1008 not_found 1456 1495 not_ready 389* 676: 1377 not_steering 1167 no_connection <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 674: \f outlst 81.06.24. 17.09. page 70 no_error 402* 422* 1013 1039 1597 1608 1658 1670 1699 1763 1947 no_of_by 844= 1158 1180= 1180 1198 1317= 1317 no_resources 673: 757 no_room 1471 no_succ_t_e 418* 1045= 1045 1046 1048 1065 1074= 1386= 1605 1607 n_ack 277* 280* 1007 1391 1392 1393 1394 1395 1396 1418 1419 ok_result 997 open 646 operation_code <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 702* 740 op_code 971* 989 op_sem 2* 1898 ord 1043 1046 1052 1063 out_data 253* 586= override 442* 991 1162 1186 1190 1202 1719 own 1898 ownertest 1790 1955 own_addr 26* 746 1540 1824 1901 1998 package_count <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 449* 659= 659 859= 859 1508 pac_alarm_log <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 318* 858 867 pac_index 370* 866 906 933 988 1363 1376 1411 1476 1487 1615 1649 1685 1689 1713 1716 param 1255* 1267 1271 1274= 1274 1279= 1279 1281 1284= 1284 1289 parameter 1293* 1316 1323= params 1316= 1323 passivated 677: 1371 passive 695 768 poll_byte 245* 1657 1669 1698 1946 poll_opc 239* 250* 1657 1669 1698 1946 pool 220* 221* process 1* p_ack 270* 280* 1391 1396 1418 1634: queue_sem 6* 646 650 695 768 1802 1966 ready_byte_msg <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 776* 808= 990 1644 1718 1749 read_code 1313: 1452: read_package_count <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 348* 1322 1507: rec 742 743 recall 1068 1095 1112 receipt 1434 1440 receipt_message <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 668 678 685 1212 1545 1619 1753 \f outlst 81.06.24. 17.09. page 71 receipt_route <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 438* 441* rec_macro 704* 742 rec_micro 705* 743 reference 229* 630* 701* 778* 816* 983* 1125* 1218* 1234* reject_cause 631* 661 668 678 685 689 reject_code 389* 1036 1055= 1071 1072= 1371= 1389= 1416= 1726= 1729= 1732= 1735= 1737= 1786 1936 reject_message <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1540 1824 1998 reject_opc 321* 1341: remove_code 1474: request_msg 1125* 1145: 1146 1212 1212 1214 res 817* 845 884 1231* 1308= 1325= 1329= 1353= 1377= 1429= 1448= 1456= 1471= 1477= 1495= 1499= 1545 restart 300* restrict_protocol <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 464* 1772* 1922 1974 result 845= result_code 1140* 1167= 1171= 1175= 1211 1212 result_range 389* 631* 817* 1140* 1231* return 654 1344 1797 1961 route_vect 441* 668 678 685 1212 1540 1545 1619 1753 rw_param 1293* 1504 1508 1512 1516 1520 r_w_max_succ_t_e <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 354* 1519: r_w_service_limit <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 352* 1511: r_w_s_a_limit <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 353* 1515: r_w_tec 351* 1503: s 1907 1916 1966 sac_rac_ix 867 874 936 939 989 1363 1363 1411 1411 1615 1615 1641 1649 1649 1685 1685 1693 1713 1713 1717 search_ac_index <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 918* 939= 1152 search_addr_code <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 890* 912= 1453 1460 1475 1688 sempointer 2* 11* send 745 746 1174 1247 1248= 1307 1352 1352 1447 sendtimer 612 send_line_state <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 971* 1051 1068 1086 1095 1103 1112 send_telegram <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 549* 1161 1185 1189 1201 1607 1657 1669 1698 1762 1946 \f outlst 81.06.24. 17.09. page 72 serial_number <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 255* 585= 585 591= 591 serif_error 299* 1728 service_alarm <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 327* 1086 1095 service_code 1405: 1415 service_lim 412* service_limit <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 412* 1083 1092 1512 serv_lim_excess <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 426* 1087 1091: 1113 signal 545 624 863 1802 1966 start_code 987 1054 1070 1375: 1388 state 271* 1391 1392 1393 1394 1395 1396 1707: state_alarm 326* 858 1717 state_au_error <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 682: 1732 state_bit 309* state_bits 305* 306* 309* state_byte 306* 1722 state_hs_error <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 666: 1735 state_power_error <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 671: 1036 1726 state_serif_error <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 683: 1729 steering 1155 steering_ac_index <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1141* 1152 1155 stop_code 1357: 1370 1828 1973 stop_poll_lim <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 413* s_a_alarm 328* 1103 1112 s_a_limit 413* 1043 1100 1109 1516 s_a_lim_excess <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 427* 1104 1108: table_index 890* 906= 908 909 910= 910 912 918* 933= 935 936 937= 937 939 1232* 1453 1454 1460 1461 1475 1476 1483 1486 1490= 1490 1491 1491 table_key 890* 909 912 918* 936 939 teste 384* 1200 1394 1604: testi 383* 1182 1393 1419 1604: testi1_byte 246* 1185 testi2_byte 247* 1189 testopen 1898 \f outlst 81.06.24. 17.09. page 73 testout 689 1345 1900 1901 timeout_err 1027 1052 time_excess 403* 1028 1052 time_out_unit <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1271 1279 top_aac_index <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 371* 908 912 935 939 1376 1463 1466= 1466 1467 1481= 1481 1490 1828 transmission_error <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 553* 574 581 transmit_error <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 672: 1055 1071 transm_cntrl 943* 1984 trans_err_rate <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 410* true 726 ts_add 748= 1152 ts_cntrl 331* 658 684 1150: 1801 1965 ts_env_vers 1900 ts_macro 25* 745 1540 1824 1998 ts_newactivity <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 340* 1349: ts_pointer 6* ts_teste 337* 658 667 684 1195: 1801 1965 ts_testi1 335* 1173: 1184 1801 1965 ts_testi2 336* 1173: 1801 1965 type_of_conversation <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 379* 391* t_ack 275* 1393 1419 1746: t_e_counter 417* 1042= 1042 1043 1063= 1063 1063 1083 1092 1100 1109 1381= 1504 t_e_c_init 1381 t_e_kind 422* 1001= 1008= 1013= 1019= 1028= 1030= 1039 1052 1162 1186 1190 1202 1597 1607 1608 1658 1658 1670 1670 1699 1699 1763 1763 1947 1947 t_e_kind_type <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 401* 422* t_e_step 410* 1043 u1 534= 619= 737= 800 808 1158= 1179= 1198= 1619 1814 u2 535= 620= 738= 800 803= 803 804 808 844 850 853= 854 854 877= 878 878 880= 997 1027 1214= 1619 1762 1814 u3 536= 609= 653 668 678 685 739= 1212 1345 1540 1545 1619 1753 1793 1958 u4 610= 658 667 684 740= 858 1148 1184 1245= 1322 1339 1801 1965 unknown_opcode <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1540 unknown_route <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1824 1998 \f outlst 81.06.24. 17.09. page 74 unknown_sender <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1171 unknown_update <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1329 1429 1499 unused 295* 305* 309* update 1311 1355 1450 upd_ac_table 345* 1444: upper_ac_tbl_index <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 371* user4 1234* 1245 valid_response <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 420* 946* 1010 1391= 1392= 1393= 1394= 1395= 1396= 1418= 1419= 1984 valid_set 399* 420* 946* version 31* 1900 w 646 650 695 768 1788 1802 1953 wait 650 1788 1953 waitsd 730 wait_sem_delay <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 730 work_addr 1237* 1247= 1249 write_read_at <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 619 z 457* 689 1345 1898 1900 1901 zone 457* \f outlst 81.06.24. 17.09. page 75 AND 9 ARRAY 3 BEGIN 74 CASE 12 CONST 6 DIV 3 DO 53 ELSE 45 END 88 FOR 3 FORWARD 1 FUNCTION 4 IF 89 IN 9 MOD 2 NIL 19 NOT 20 OF 18 OR 3 OTHERWISE 12 PACKED 2 PROCEDURE 14 RECORD 2 REPEAT 4 SET 2 THEN 89 TO 3 TYPE 7 UNTIL 4 VAR 29 WHILE 4 WITH 30 *pascal80 codesize.12000 alarmenv tsenvir atcsource 81.06.24. 17.11. pascal80 version 1981.04.01 name headline beginline endline appetite(words) create_chann 528 530 545 : 11 send_telegra 572 575 624 : 15 handle_queue 644 647 695 : 19 get_message 724 726 772 : 15 ready_byte_m 794 796 812 : 13 finish_messa 835 840 888 : 40 search_addr_ 904 906 912 : 9 search_ac_in 931 933 939 : 9 send_line_st 983 988 991 : 25 transm_cntrl 971 998 1123 : 15 initiate_con 1140 1145 1216 : 25 connect_mess 1237 1241 1253 : 15 compute_dela 1265 1267 1291 : 3 rw_param 1303 1305 1333 : 13 exec_conn_op 1231 1341 1545 : 28 finish_conve 1595 1599 1770 : 24 restrict_pro 1782 1786 1828 : 18 atconnector 31 1898 2004 : 164 code: 0 . 9858 = 9858 bytes end of PASCAL80 compilation end blocksread = 52 *o c ▶EOF◀