Changeset 72 in tmcsimulator for branches/fep_client_cpp/network_factory.cpp
- Timestamp:
- 09/07/2017 01:36:46 PM (9 years ago)
- File:
-
- 1 edited
-
branches/fep_client_cpp/network_factory.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/fep_client_cpp/network_factory.cpp
r71 r72 1 1 #include "network.h" 2 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 3 154 FEP_LINE_LDS * load_lines(int *size, const char * fName) 4 155 { 5 FEP_LINE_LDS *lines = (FEP_LINE_LDS *) malloc(sizeof(FEP_LINE_LDS));156 FEP_LINE_LDS *lines = (FEP_LINE_LDS *) calloc(sizeof(FEP_LINE_LDS), 1); 6 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; 7 166 return lines; 8 167 } 9 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 10 175 LDS_LOOP * load_lds(const char * fName) 11 176 { 12 LDS_LOOP *lds_map = (LDS_LOOP *) malloc(sizeof(LDS_LOOP)); 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 13 213 return lds_map; 14 214 }
Note: See TracChangeset
for help on using the changeset viewer.
