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