- Timestamp:
- 09/07/2017 01:36:46 PM (9 years ago)
- Location:
- branches/fep_client_cpp
- Files:
-
- 3 added
- 3 edited
-
fep_client.cpp (modified) (4 diffs)
-
lds_data (added)
-
lds_data/lookup_lds (added)
-
lds_data/lookup_loop (added)
-
network.h (modified) (1 diff)
-
network_factory.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/fep_client_cpp/fep_client.cpp
r71 r72 28 28 } 29 29 30 31 30 void xfer_replys(CLIENT *clnt, FEP_LINE_LDS *lines, int lines_size, LDS_LOOP *ldsMap) 32 31 { 32 printf("Lines_size %d\n", lines_size); 33 33 int i, j; // i == line_index, j == lds_index 34 34 void *rv; … … 58 58 uci_unix_simulation_time(uci_simulation_time()); // GMT time 59 59 */ 60 fepReply.schedule_time = time(NULL); 61 62 60 63 fepReply.user_info1 = lines[i].lineNum; 61 64 fepReply.user_info2 = lines[i].lineNum; … … 134 137 135 138 /* Load data to be xfered to ATMS */ 136 int lines_size; 139 int lines_size = 0; 140 printf("Loading lines and ldsMap\n"); 137 141 FEP_LINE_LDS *lines = load_lines(&lines_size, "./lines_atms.txt"); 142 printf("Done loading lines\n"); 138 143 LDS_LOOP *ldsMap = load_lds("./lds_atms.txt"); 144 printf("Done loading lines and lds...\n"); 139 145 140 146 /* Transfer data to ATMS */ … … 142 148 143 149 /* Free allocated memory */ 144 free(lines);145 free(ldsMap);146 150 147 151 /* Destroy client */ -
branches/fep_client_cpp/network.h
r71 r72 2 2 #define NETWORK_H 3 3 #include <vector> 4 4 5 using namespace std; 6 // the first byte is not considered in the calculation of "BYTE 2" 7 const int Fixed_Byte_To_Checksum = 25; 8 9 const int CONTROL_DATA_LEN = 27; 10 11 char * const dp5[8] = { "ML_1", "ML_2", "ML_3", "ML_4", "ML_5", 12 "ML_6", "HOV_Lane", "FYW_Conn"}; 13 char * const dp6[8] = { "OS_1", "OS_2", "OS_3", "OS_4", "OS_5", 14 "OS_6", "COLL_DIST_2", "COLL_DIST_OFF"}; 15 char * const dp7[8] = { "DEMAND", "PASSAGE", "QUEUE", "RAMP_ON", 16 "RAMP_OFF", "RAMP_HOV", "COLL_DIST_1", "COLL_DIST_ON"}; 17 char * const dp8[8] = { "SD_1", "SD_2", "SD_3", "SD_4", "SD_5", 18 "SD_6", "Pass_Vol_Count", "X"}; 19 20 5 21 6 22 typedef struct loopagg LOOPAGG; -
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.
