source: tmcsimulator/branches/ATMSCommunicator/NetworkReader.cpp @ 76

Revision 76, 5.5 KB checked in by jtorres, 9 years ago (diff)

In network.java, LoopDetectorStation?.java and LoopDetector?.java, added network writing capabilities. The network can now be written to a specified xml file to be read by the cpp ATMS RPC program. The network reader is finished and reads in all static network data correctly

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