| 1 | #include "network.h" |
|---|
| 2 | #include <vector> |
|---|
| 3 | #include <math.h> |
|---|
| 4 | #include "network_factory.h" |
|---|
| 5 | |
|---|
| 6 | // determine if a loop has data based on lane config data |
|---|
| 7 | bool NetworkFactory::DataAvail(char flag, int num) { |
|---|
| 8 | int mag, fel; |
|---|
| 9 | |
|---|
| 10 | // find mask value |
|---|
| 11 | if (num == 1) |
|---|
| 12 | mag = 0x01; |
|---|
| 13 | else if (num == 2) |
|---|
| 14 | mag = 0x02; |
|---|
| 15 | else if (num == 3) |
|---|
| 16 | mag = 0x04; |
|---|
| 17 | else if (num == 4) |
|---|
| 18 | mag = 0x08; |
|---|
| 19 | else if (num == 5) |
|---|
| 20 | mag = 0x10; |
|---|
| 21 | else if (num == 6) |
|---|
| 22 | mag = 0x20; |
|---|
| 23 | else if (num == 7) |
|---|
| 24 | mag = 0x40; |
|---|
| 25 | else if (num == 8) |
|---|
| 26 | mag = 0x80; |
|---|
| 27 | |
|---|
| 28 | fel = flag & mag; |
|---|
| 29 | fel = fel >> (num - 1); |
|---|
| 30 | |
|---|
| 31 | if (fel == 1) |
|---|
| 32 | return true; |
|---|
| 33 | else |
|---|
| 34 | return false; |
|---|
| 35 | } |
|---|
| 36 | |
|---|
| 37 | // Initializes the LOOP dataPack with all necessary static data and default dynamic data |
|---|
| 38 | void NetworkFactory::init_loop_dataPack(STATION *loop) |
|---|
| 39 | { |
|---|
| 40 | int j; |
|---|
| 41 | // Allocate memory for dataPack |
|---|
| 42 | loop->dataPack = (unsigned char *) calloc(sizeof(unsigned char), loop->length); |
|---|
| 43 | |
|---|
| 44 | // dataPack 5-8: lane config |
|---|
| 45 | char d5 = 0, d6 = 0, d7 = 0, d8 = 0; |
|---|
| 46 | for (j = 0; j < loop->loops.size(); j++) |
|---|
| 47 | { |
|---|
| 48 | char * currLoc = loop->loops[j].loop_loc; |
|---|
| 49 | for (int k = 0; k < 8; k++) |
|---|
| 50 | { |
|---|
| 51 | if (strcmp(currLoc, dp5[k]) == 0) |
|---|
| 52 | d5 += pow(2, k); |
|---|
| 53 | if (strcmp(currLoc, dp6[k]) == 0) |
|---|
| 54 | d6 += pow(2, k); |
|---|
| 55 | if (strcmp(currLoc, dp7[k]) == 0) |
|---|
| 56 | d7 += pow(2, k); |
|---|
| 57 | if (strcmp(currLoc, dp8[k]) == 0) |
|---|
| 58 | d8 += pow(2, k); |
|---|
| 59 | } |
|---|
| 60 | } |
|---|
| 61 | loop->dataPack[5-1] = d5; |
|---|
| 62 | loop->dataPack[6-1] = d6; |
|---|
| 63 | loop->dataPack[7-1] = d7; |
|---|
| 64 | loop->dataPack[8-1] = d8; |
|---|
| 65 | |
|---|
| 66 | // dataPack 1: Drop number, i.e. station address |
|---|
| 67 | loop->dataPack[1-1] = loop->drop; |
|---|
| 68 | |
|---|
| 69 | // dataPack2 (2 bytes per loop) |
|---|
| 70 | loop->dataPack[2-1] = loop->loops.size() * 2 + Fixed_Byte_To_Checksum; |
|---|
| 71 | |
|---|
| 72 | // dataPacket 3 (lowbyte: # of mainline loops, highbyte: # of opposite loops) |
|---|
| 73 | int low = 0, high = 0; |
|---|
| 74 | for (j = 1; j <= 6; j++) |
|---|
| 75 | { |
|---|
| 76 | low += DataAvail(loop->dataPack[5-1], j); |
|---|
| 77 | high += DataAvail(loop->dataPack[6-1], j); |
|---|
| 78 | } |
|---|
| 79 | high = high << 4; |
|---|
| 80 | loop->dataPack[3-1] = high | low; |
|---|
| 81 | |
|---|
| 82 | // dataPack4 (Miscl. flags: samples are: 80, A0, E0, 00) |
|---|
| 83 | loop->dataPack[4-1] = 0xA0; |
|---|
| 84 | |
|---|
| 85 | // dataPack 9: initialized as 00 (meaning no metering); need to be updated every 30 sec |
|---|
| 86 | loop->dataPack[9-1] = 0; |
|---|
| 87 | |
|---|
| 88 | // datadataPack 10-13: lane malfunction? Assuming all functional |
|---|
| 89 | loop->dataPack[10-1] = 0; |
|---|
| 90 | loop->dataPack[11-1] = 0; |
|---|
| 91 | loop->dataPack[12-1] = 0; |
|---|
| 92 | loop->dataPack[13-1] = 0; |
|---|
| 93 | |
|---|
| 94 | // dataPack 14-22: ramp metering data |
|---|
| 95 | // BYTE 16 and 22 need to be updated every 30 sec |
|---|
| 96 | bool found = false; |
|---|
| 97 | for (j = 0; j < loop->loops.size(); j++) |
|---|
| 98 | { |
|---|
| 99 | if (strcmp(loop->loops.at(0).loop_loc, "DEMAND") == 0) |
|---|
| 100 | { |
|---|
| 101 | found = true; |
|---|
| 102 | break; |
|---|
| 103 | } |
|---|
| 104 | } |
|---|
| 105 | if (found) |
|---|
| 106 | { |
|---|
| 107 | // BYTE 14: mostly 07, some are 05, 03, 00 |
|---|
| 108 | loop->dataPack[14-1] = 0x07; |
|---|
| 109 | // mostly 06(TOD table 1); some are 0B (No metering) or 05(traffic responsive) |
|---|
| 110 | loop->dataPack[15-1] = 0x06; |
|---|
| 111 | // most 00, some are 01 (queue override) or 80(Meter ON sign) |
|---|
| 112 | loop->dataPack[16-1] = 0x00; |
|---|
| 113 | // Field Manual Rate |
|---|
| 114 | loop->dataPack[17-1] = 0xFF; |
|---|
| 115 | // TOC Manual Rate |
|---|
| 116 | loop->dataPack[18-1] = 0xFF; |
|---|
| 117 | // PSO Manual Rate |
|---|
| 118 | loop->dataPack[19-1] = 0xFF; |
|---|
| 119 | // CORM Rate |
|---|
| 120 | loop->dataPack[20-1] = 0xFF; |
|---|
| 121 | // Local Responsive Rate. DON'T UNDERSTAND YET |
|---|
| 122 | loop->dataPack[21-1] = 0x00; |
|---|
| 123 | // TOD Rate: need to query RAMP plugin! |
|---|
| 124 | loop->dataPack[22-1] = 0x00; |
|---|
| 125 | } |
|---|
| 126 | // LDS: NO Metering |
|---|
| 127 | else |
|---|
| 128 | { |
|---|
| 129 | loop->dataPack[14-1] = 0x00; |
|---|
| 130 | loop->dataPack[15-1] = 0x0B; |
|---|
| 131 | loop->dataPack[16-1] = 0x00; |
|---|
| 132 | loop->dataPack[17-1] = 0xFF; |
|---|
| 133 | loop->dataPack[18-1] = 0xFF; |
|---|
| 134 | loop->dataPack[19-1] = 0xFF; |
|---|
| 135 | loop->dataPack[20-1] = 0xFF; |
|---|
| 136 | loop->dataPack[21-1] = 0x00; |
|---|
| 137 | loop->dataPack[22-1] = 0x00; |
|---|
| 138 | } |
|---|
| 139 | |
|---|
| 140 | // dataPack 23-24: sum of mainline/Oppsite traffic data; need to be updated every 30 sec |
|---|
| 141 | loop->MlTotVol = 0; |
|---|
| 142 | loop->OppTotVol = 0; |
|---|
| 143 | loop->dataPack[23-1] = loop->MlTotVol; |
|---|
| 144 | loop->dataPack[24-1] = loop->OppTotVol; |
|---|
| 145 | |
|---|
| 146 | // dataPack 25-26: BYTE 25 is fixed, i.e. 03; BYTE 26 is either 0xA2 or 0x84 |
|---|
| 147 | loop->dataPack[25-1] = 0x03; |
|---|
| 148 | loop->dataPack[26-1] = 0x84; |
|---|
| 149 | |
|---|
| 150 | printf("lds=%d (%d), p1=%2X, p2=%2X, p3=%2X, p5=%2X, p6=%X, p7=%X, p8=%2X\n", |
|---|
| 151 | loop->lds, loop->length, loop->dataPack[1-1], loop->dataPack[2-1], |
|---|
| 152 | loop->dataPack[3-1], loop->dataPack[5-1], |
|---|
| 153 | loop->dataPack[6-1], loop->dataPack[7-1], loop->dataPack[8-1]); |
|---|
| 154 | } |
|---|
| 155 | |
|---|
| 156 | // TEST DATA |
|---|
| 157 | // lds_id line drop sch lineinfo system_key sch_seq glo_seq count freeway Dir ca_pm lds_name |
|---|
| 158 | // 1203103 50 13 13 13 1123005873 24148 1357650 19 55 S 6.88 MACARTHU1 |
|---|
| 159 | FEP_LINE * NetworkFactory::load_lines(int *size, const char * fName) |
|---|
| 160 | { |
|---|
| 161 | FEP_LINE *lines = (FEP_LINE *) calloc(sizeof(FEP_LINE), 1); |
|---|
| 162 | *size = 1; |
|---|
| 163 | lines[0].lineNum = 50; |
|---|
| 164 | lines[0].lds.push_back(1203103); |
|---|
| 165 | lines[0].ldsIndex.push_back(0); |
|---|
| 166 | lines[0].lds.size() = 1; |
|---|
| 167 | lines[0].count = 19; |
|---|
| 168 | lines[0].schedule = 13; |
|---|
| 169 | lines[0].globalSeq = 1357650; |
|---|
| 170 | lines[0].schedleSeq = 24148; |
|---|
| 171 | return lines; |
|---|
| 172 | } |
|---|
| 173 | |
|---|
| 174 | // TEST DATA |
|---|
| 175 | //FWY Dir POSTMI LDS_ID VDS_ID LOOP_ID LOC LANE LOOP_LOC PARAMICS_NAME PARAMICS_LANE |
|---|
| 176 | //55 S 6.88 1203103 1203104 1203105 QU 1 QUEUE 55s6.88ora 0 |
|---|
| 177 | |
|---|
| 178 | //55 S 6.88 1203103 1203104 1203106 DM 2 DEMAND 55s6.88ora 0 |
|---|
| 179 | |
|---|
| 180 | //55 S 6.88 1203103 1203104 1203107 PA 3 PASSAGE 55s6.88ora 0 |
|---|
| 181 | |
|---|
| 182 | //55 S 6.88 1203103 1203108 1203109 HV 1 SD_1 ? 0 |
|---|
| 183 | |
|---|
| 184 | //55 S 6.88 1203103 1203110 1203111 ML 1 ML_1 55s6.88ml 4 |
|---|
| 185 | |
|---|
| 186 | //55 S 6.88 1203103 1203110 1203112 ML 2 ML_2 55s6.88ml 3 |
|---|
| 187 | |
|---|
| 188 | //55 S 6.88 1203103 1203110 1203113 ML 3 ML_3 55s6.88ml 2 |
|---|
| 189 | |
|---|
| 190 | //55 S 6.88 1203103 1203110 1203114 ML 4 ML_4 55s6.88ml 1 |
|---|
| 191 | STATION * NetworkFactory::load_lds(const char * fName) |
|---|
| 192 | { |
|---|
| 193 | /* Read loop meta data */ |
|---|
| 194 | STATION *lds_map = (STATION *) calloc(sizeof(STATION), 1); |
|---|
| 195 | lds_map[0].lds = 1203103; |
|---|
| 196 | lds_map[0].line_num = 50; |
|---|
| 197 | lds_map[0].drop = 13; |
|---|
| 198 | |
|---|
| 199 | // Loop ids |
|---|
| 200 | long *loopIDs = (long *) calloc(sizeof(long), lds_map[0].loops.size()); |
|---|
| 201 | loopIDs[0] = 1203113; |
|---|
| 202 | lds_map[0].loops.push_back(1203113); |
|---|
| 203 | |
|---|
| 204 | // Init Loop dataPack |
|---|
| 205 | lds_map[0].length = lds_map[0].loops.size() * 2 + CONTROL_DATA_LEN; |
|---|
| 206 | // init_loop_dataPack(lds_map); |
|---|
| 207 | |
|---|
| 208 | lds_map[0].pos = 0; |
|---|
| 209 | |
|---|
| 210 | lds_map[0].MlTotVol = 0; |
|---|
| 211 | lds_map[0].OppTotVol = 0; |
|---|
| 212 | |
|---|
| 213 | DataPacker dp; |
|---|
| 214 | lds_map[0].dataPack = dp.packData(lds_map[0]); |
|---|
| 215 | |
|---|
| 216 | |
|---|
| 217 | return lds_map; |
|---|
| 218 | } |
|---|