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

Revision 73, 5.7 KB checked in by jtorres, 9 years ago (diff)

changed some comments / housekeeping

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