| | 40 | const int LaneQueuesSectIds[] = { |
| | 41 | 1, 2, 3, 6, 7, |
| | 42 | 3, 4, 5, |
| | 43 | 35, 28, 32, 33, 34, |
| | 44 | 26, 27, 35, 28, 29, 30, 31, |
| | 45 | 16, 17, 18, 19, 20, 14, 15, |
| | 46 | 16, 17, 18, 19, 20, 12, 13, |
| | 47 | 21, 22, 23, 24, 25, 40, |
| | 48 | 21, 22, 23, 24, 25, 40, |
| | 49 | 61, 62, 63, 64, 65, |
| | 50 | 287,288,54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, |
| | 51 | 45, 49, 51, |
| | 52 | 45, 49, 50, |
| | 53 | 43, 44, |
| | 54 | 43, 44, 42 }; |
| | 55 | const int NumLaneQueuesSectIds = sizeof(LaneQueuesSectIds)/sizeof(int); |
| | 56 | |
| | 57 | /* This array contains offsets of particular lanes stored in LaneQueuesSectIds, |
| | 58 | plus the would-be offset of the next non-existent lane (this is used to |
| | 59 | set the limits of the index when extracting statistical data from the |
| | 60 | section_stats structure). */ |
| | 61 | int LaneQueueOffsets[] = { |
| | 62 | 0, 5, 8, 13, 20, 27, |
| | 63 | 34, 40, 46, 51, 65, 68, 70, 72, NumLaneQueuesSectIds+1 }; |
| | 64 | |
| | 65 | /* The position of the statistics is given by the indices in the StatIds |
| | 66 | array. In order to parse the statistics correctly we have to create |
| | 67 | a copy of LaneQueuesSectIds holding indices to the StatIds array instead |
| | 68 | of the original section ids. */ |
| | 69 | int * LaneQueuesStatPos; |
| | 70 | |
| | 71 | const int LaneQueuesLaneIds[] = { |
| | 72 | 1, 1, 2, 1, 1, |
| | 73 | 1, 1, 1, |
| | 74 | 2, 2, 1, 1, 1, |
| | 75 | 1, 1, 1, 1, 1, 1, 1, |
| | 76 | 2, 2, 2, 2, 2, 1, 1, |
| | 77 | 1, 1, 1, 1, 1, 1, 1, |
| | 78 | 2, 2, 2, 2, 2, 2, |
| | 79 | 1, 1, 1, 1, 1, 1, |
| | 80 | 2, 2, 2, 2, 2, |
| | 81 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
| | 82 | 2, 2, 1, |
| | 83 | 1, 1, 1, |
| | 84 | 2, 2, |
| | 85 | 1, 1, 1 }; |
| | 86 | |
| | 389 | |
| | 390 | /* Create LaneQueuesStatPos holding indices to the statistical data for the |
| | 391 | sections listed in LaneQueuesSectIds in the same order. */ |
| | 392 | LaneQueuesStatPos = (int *) calloc ( NumLaneQueuesSectIds, sizeof(int)); |
| | 393 | for ( int i=0 ; i < NumLaneQueuesSectIds ; i++ ) |
| | 394 | { |
| | 395 | int p = _search_index ( StatIds, NumStatIds, LaneQueuesSectIds[i] ); |
| | 396 | if ( p >= 0 ) |
| | 397 | { |
| | 398 | LaneQueuesStatPos[i] = p; |
| | 399 | } |
| | 400 | else |
| | 401 | { |
| | 402 | fprintf ( stderr, "Cannot find index LaneQueuesStatIds[%d]=%d in StatIds!\n", |
| | 403 | i, LaneQueuesSectIds[i] ); |
| | 404 | exit(1); |
| | 405 | } |
| | 406 | } |
| | 515 | } |
| | 516 | |
| | 517 | /* Loop over the statistical data. We will extract the queue length for |
| | 518 | every intersection and store it into the data vector. */ |
| | 519 | int oLanes = 0; // lane offset for the actual intersection |
| | 520 | int oLpos = 0; |
| | 521 | for ( int i = 0 ; i < NumIntersections ; i++ ) |
| | 522 | { |
| | 523 | /* Every intersection has a certain number of lanes that (roughly) |
| | 524 | correspond to the number of signal groups. */ |
| | 525 | int nLanes = NumLanes[i]; |
| | 526 | int qoffset = QueueLengthOffsets[i]; |
| | 527 | for ( int j = 0 ; j < nLanes ; j++ ) |
| | 528 | { |
| | 529 | /* Initial queue length for this lane is zero. */ |
| | 530 | int qLen = 0; |
| | 531 | /* Every lane has one or more section identifiers at certain |
| | 532 | positions in LaneQueuesStatIds. The sequence of lanes |
| | 533 | is given by offsets in LaneQueueOffsets, the position of |
| | 534 | the statistical information is stored in LaneQueuesStatPos. */ |
| | 535 | for ( int k = oLpos ; k < LaneQueueOffsets[oLanes+j+1] ; k++ ) |
| | 536 | { |
| | 537 | /* Get the index into statistical information records. */ |
| | 538 | int pi = LaneQueuesStatPos[k]; |
| | 539 | int pl = LaneQueuesLaneIds[k]-1; // indices are not zero-based |
| | 540 | /* Now query the last queue length (section with more than |
| | 541 | one lane holds several queue lengths) and add it to the |
| | 542 | acumulated queue length value. */ |
| | 543 | qLen += sections_stats.queues[pi*sections_stats.max_lanes+pl]; |
| | 544 | } |
| | 545 | /* Move the lane position offset. */ |
| | 546 | oLpos = LaneQueueOffsets[oLanes+j+1]; |
| | 547 | /* Update the data vector. */ |
| | 548 | dt[qoffset+j] = qLen; |
| | 549 | } |
| | 550 | oLanes = oLanes + nLanes; |