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