Changeset 165 in tmcsimulator for branches/green_dot/network_factory.cpp
- Timestamp:
- 10/23/2017 11:44:05 AM (9 years ago)
- File:
-
- 1 edited
-
branches/green_dot/network_factory.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/green_dot/network_factory.cpp
r164 r165 1 1 #include "network.h" 2 #include "DataPacker.h" 2 3 #include <vector> 3 4 #include <math.h> … … 6 7 #include <cstdlib> 7 8 8 // determine if a loop has data based on lane config data9 bool DataAvail(char flag, int num) {10 int mag, fel;11 12 // find mask value13 if (num == 1)14 mag = 0x01;15 else if (num == 2)16 mag = 0x02;17 else if (num == 3)18 mag = 0x04;19 else if (num == 4)20 mag = 0x08;21 else if (num == 5)22 mag = 0x10;23 else if (num == 6)24 mag = 0x20;25 else if (num == 7)26 mag = 0x40;27 else if (num == 8)28 mag = 0x80;29 30 fel = flag & mag;31 fel = fel >> (num - 1);32 33 if (fel == 1)34 return true;35 else36 return false;37 }38 39 // Initializes the LDS_LOOP dataPack with all necessary static data and default dynamic data40 void init_loop_dataPack(LDS_LOOP *loop)41 {42 int j;43 // Allocate memory for dataPack44 loop->dataPack = (unsigned char *) calloc(sizeof(unsigned char), loop->length);45 46 // dataPack 5-8: lane config47 char d5 = 0, d6 = 0, d7 = 0, d8 = 0;48 for (j = 0; j < loop->num; j++)49 {50 for (int k = 0; k < 8; k++)51 {52 if (strcmp(loop->loop_loc[j], dp5[k]) == 0)53 d5 += pow(2, k);54 if (strcmp(loop->loop_loc[j], dp6[k]) == 0)55 d6 += pow(2, k);56 if (strcmp(loop->loop_loc[j], dp7[k]) == 0)57 d7 += pow(2, k);58 if (strcmp(loop->loop_loc[j], dp8[k]) == 0)59 d8 += pow(2, k);60 }61 }62 loop->dataPack[5-1] = d5;63 loop->dataPack[6-1] = d6;64 loop->dataPack[7-1] = d7;65 loop->dataPack[8-1] = d8;66 67 // dataPack 1: Drop number, i.e. station address68 loop->dataPack[1-1] = loop->drop;69 70 // dataPack2 (2 bytes per loop)71 loop->dataPack[2-1] = loop->num * 2 + Fixed_Byte_To_Checksum;72 73 // dataPacket 3 (lowbyte: # of mainline loops, highbyte: # of opposite loops)74 int low = 0, high = 0;75 for (j = 1; j <= 6; j++)76 {77 low += DataAvail(loop->dataPack[5-1], j);78 high += DataAvail(loop->dataPack[6-1], j);79 }80 high = high << 4;81 loop->dataPack[3-1] = high | low;82 83 // dataPack4 (Miscl. flags: samples are: 80, A0, E0, 00)84 loop->dataPack[4-1] = 0xA0;85 86 // dataPack 9: initialized as 00 (meaning no metering); need to be updated every 30 sec87 loop->dataPack[9-1] = 0;88 89 // datadataPack 10-13: lane malfunction? Assuming all functional90 loop->dataPack[10-1] = 0;91 loop->dataPack[11-1] = 0;92 loop->dataPack[12-1] = 0;93 loop->dataPack[13-1] = 0;94 95 // dataPack 14-22: ramp metering data96 // BYTE 16 and 22 need to be updated every 30 sec97 bool found = false;98 for (j = 0; j < loop->num; j++)99 {100 if (strcmp(loop->loop_loc[j], "DEMAND") == 0)101 {102 found = true;103 break;104 }105 }106 if (found)107 {108 // BYTE 14: mostly 07, some are 05, 03, 00109 loop->dataPack[14-1] = 0x07;110 // mostly 06(TOD table 1); some are 0B (No metering) or 05(traffic responsive)111 loop->dataPack[15-1] = 0x06;112 // most 00, some are 01 (queue override) or 80(Meter ON sign)113 loop->dataPack[16-1] = 0x00;114 // Field Manual Rate115 loop->dataPack[17-1] = 0xFF;116 // TOC Manual Rate117 loop->dataPack[18-1] = 0xFF;118 // PSO Manual Rate119 loop->dataPack[19-1] = 0xFF;120 // CORM Rate121 loop->dataPack[20-1] = 0xFF;122 // Local Responsive Rate. DON'T UNDERSTAND YET123 loop->dataPack[21-1] = 0x00;124 // TOD Rate: need to query RAMP plugin!125 loop->dataPack[22-1] = 0x00;126 }127 // LDS: NO Metering128 else129 {130 loop->dataPack[14-1] = 0x00;131 loop->dataPack[15-1] = 0x0B;132 loop->dataPack[16-1] = 0x00;133 loop->dataPack[17-1] = 0xFF;134 loop->dataPack[18-1] = 0xFF;135 loop->dataPack[19-1] = 0xFF;136 loop->dataPack[20-1] = 0xFF;137 loop->dataPack[21-1] = 0x00;138 loop->dataPack[22-1] = 0x00;139 }140 141 // dataPack 23-24: sum of mainline/Oppsite traffic data; need to be updated every 30 sec142 loop->MlTotVol = 0;143 loop->OppTotVol = 0;144 loop->dataPack[23-1] = loop->MlTotVol;145 loop->dataPack[24-1] = loop->OppTotVol;146 147 // dataPack 25-26: BYTE 25 is fixed, i.e. 03; BYTE 26 is either 0xA2 or 0x84148 loop->dataPack[25-1] = 0x03;149 loop->dataPack[26-1] = 0x84;150 151 printf("lds=%d (%d), p1=%2X, p2=%2X, p3=%2X, p5=%2X, p6=%X, p7=%X, p8=%2X\n",152 loop->lds, loop->length, loop->dataPack[1-1], loop->dataPack[2-1],153 loop->dataPack[3-1], loop->dataPack[5-1],154 loop->dataPack[6-1], loop->dataPack[7-1], loop->dataPack[8-1]);155 }156 9 157 10 // TEST DATA … … 190 43 191 44 //55 S 6.88 1203103 1203110 1203114 ML 4 ML_4 55s6.88ml 1 192 LDS_LOOP* load_lds(const char * fName)45 STATION * load_lds(const char * fName) 193 46 { 194 47 /* Read loop meta data */ 195 LDS_LOOP *lds_map = (LDS_LOOP *) calloc(sizeof(LDS_LOOP), 1);48 STATION *lds_map = (STATION *) calloc(sizeof(STATION), 1); 196 49 lds_map[0].lds = 1203103; 197 50 lds_map[0].line_num = 50; … … 199 52 lds_map[0].num = 1; 200 53 201 // Loop ids 202 long *loopIDs = (long *) calloc(sizeof(long), lds_map[0].num);203 loopIDs[0] = 1203113;204 lds_map[0].loopID = loopIDs;205 206 // Loop locations 207 char *loc = "ML_3"; 208 lds_map[0].loop_loc = &loc;209 54 LOOP *loop = new LOOP; 55 loop->loopID = 1203113; 56 loop->loop_loc = "ML_3"; 57 loop->vol = 40; 58 loop->occ = 10; 59 loop->spd = 10; 60 61 lds_map[0].loops.push_back(loop); 62 210 63 // Init Loop dataPack 211 64 lds_map[0].length = lds_map[0].num * 2 + CONTROL_DATA_LEN; 212 init_loop_dataPack(lds_map); 65 66 lds_map[0].dataPack = DataPacker::packData(&lds_map[0]); 213 67 214 68 lds_map[0].pos = 0;
Note: See TracChangeset
for help on using the changeset viewer.
