source: tmcsimulator/branches/fep_client_cpp/network_factory.cpp @ 74

Revision 74, 5.8 KB checked in by jtorres, 9 years ago (diff)

network_factory.cpp: changed test data, successful green dot

Line 
1#include "network.h"
2#include <vector>
3#include <math.h>
4
5// determine if a loop has data based on lane config data
6bool 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
37void 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
157FEP_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
189LDS_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}
Note: See TracBrowser for help on using the repository browser.