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

Revision 72, 5.6 KB checked in by jtorres, 9 years ago (diff)

added lds_data files, we are now dumping fep_reply to ATMS with real data

Line 
1#include "network.h"
2#include <vector>
3#include <math.h>
4// determine if a loop has data based on lane config data
5bool 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
36void 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 
154FEP_LINE_LDS * load_lines(int *size, const char * fName)
155{
156        FEP_LINE_LDS *lines = (FEP_LINE_LDS *) calloc(sizeof(FEP_LINE_LDS), 1);
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;
166        return lines;   
167}
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
175LDS_LOOP * load_lds(const char * fName)
176{
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
213        return lds_map;
214}
Note: See TracBrowser for help on using the repository browser.