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