source: tmcsimulator/branches/BasicFEPClient/network_factory.cpp @ 146

Revision 146, 7.6 KB checked in by jtorres, 9 years ago (diff)

BasicFEPClient with SandCanyon? (white dot) data, note: does not work

Line 
1#include "network.h"
2#include <vector>
3#include <math.h>
4#include "network_factory.h"
5#include "DataPacker.h"
6
7// determine if a loop has data based on lane config data
8bool NetworkFactory::DataAvail(char flag, int num) {
9        int mag, fel;
10
11        // find mask value
12        if (num == 1)
13                mag = 0x01;
14        else if (num == 2)
15                mag = 0x02;
16        else if (num == 3)
17                mag = 0x04;
18        else if (num == 4)
19                mag = 0x08;
20        else if (num == 5)
21                mag = 0x10;
22        else if (num == 6)
23                mag = 0x20;
24        else if (num == 7)
25                mag = 0x40;
26        else if (num == 8)
27                mag = 0x80;
28       
29        fel = flag & mag;
30        fel = fel >> (num - 1);
31       
32        if (fel == 1)
33                return true;
34        else 
35                return false;
36}
37
38// Initializes the LOOP dataPack with all necessary static data and default dynamic data
39void NetworkFactory::init_loop_dataPack(STATION *loop)
40{
41        int j;
42        // Allocate memory for dataPack
43        loop->dataPack = (unsigned char *) calloc(sizeof(unsigned char), loop->length);
44
45        // dataPack 5-8: lane config
46        char d5 = 0, d6 = 0, d7 = 0, d8 = 0;           
47        for (j = 0; j < loop->loops.size(); j++)
48        {
49            char * currLoc = loop->loops[j]->loop_loc;
50                for (int k = 0; k < 8; k++)
51                {
52                        if (strcmp(currLoc, dp5[k]) == 0)
53                                d5 += pow(2, k);
54                        if (strcmp(currLoc, dp6[k]) == 0)
55                                d6 += pow(2, k);
56                        if (strcmp(currLoc, dp7[k]) == 0)
57                                d7 += pow(2, k);
58                        if (strcmp(currLoc, 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 address
68        loop->dataPack[1-1] = loop->drop;
69
70        // dataPack2 (2 bytes per loop)
71        loop->dataPack[2-1] = loop->loops.size() * 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 sec
87        loop->dataPack[9-1] = 0;
88
89        // datadataPack 10-13: lane malfunction? Assuming all functional
90        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 data
96        // BYTE 16 and 22 need to be updated every 30 sec
97        bool found = false;
98        for (j = 0; j < loop->loops.size(); j++)
99        {
100                if (strcmp(loop->loops.at(0)->loop_loc, "DEMAND") == 0)
101                {
102                        found = true;
103                        break;
104                }
105        }
106        if (found)
107        {
108                // BYTE 14: mostly 07, some are 05, 03, 00
109                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 Rate
115                loop->dataPack[17-1] = 0xFF;
116                // TOC Manual Rate
117                loop->dataPack[18-1] = 0xFF;
118                // PSO Manual Rate
119                loop->dataPack[19-1] = 0xFF;
120                // CORM Rate
121                loop->dataPack[20-1] = 0xFF;
122                // Local Responsive Rate. DON'T UNDERSTAND YET
123                loop->dataPack[21-1] = 0x00;
124                // TOD Rate: need to query RAMP plugin!
125                loop->dataPack[22-1] = 0x00;
126        }
127        // LDS: NO Metering
128        else
129        {
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 sec
142        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 0x84
148        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
157// TEST DATA: WORKING
158// lds_id       line    drop sch lineinfo       system_key      sch_seq glo_seq         count   freeway Dir     ca_pm   lds_name               
159// 1203103      50      13      13      13      1123005873      24148   1357650         19      55      S       6.88    MACARTHU1
160
161// SAND CANYON: NOT WORKING
162// 1204813      31      18      5       5       1123005744      26489   1357649         18      5       S       23.5    S OF SAND CNYN
163
164FEP_LINE * NetworkFactory::load_lines(int *size, const char * fName)
165{
166        FEP_LINE *lines = (FEP_LINE *) calloc(sizeof(FEP_LINE), 1);
167        *size = 1;
168        lines[0].lineNum = 31;
169        lines[0].lds.push_back(1204813);
170        lines[0].ldsIndex.push_back(0);
171        lines[0].count = 18;
172        lines[0].schedule = 5;
173        lines[0].globalSeq = 1357649;
174        lines[0].schedleSeq = 26489;
175        return lines;   
176}
177
178// TEST DATA: Working (MacAruthur))
179//FWY   Dir     POSTMI  LDS_ID  VDS_ID  LOOP_ID LOC    LANE LOOP_LOC            PARAMICS_NAME  PARAMICS_LANE   
180//55    S       6.88    1203103 1203104 1203105 QU      1       QUEUE           55s6.88ora      0
181//55    S       6.88    1203103 1203104 1203106 DM      2       DEMAND          55s6.88ora      0
182//55    S       6.88    1203103 1203104 1203107 PA      3       PASSAGE         55s6.88ora      0
183//55    S       6.88    1203103 1203108 1203109 HV      1       SD_1            ?               0
184//55    S       6.88    1203103 1203110 1203111 ML      1       ML_1            55s6.88ml       4
185//55    S       6.88    1203103 1203110 1203112 ML      2       ML_2            55s6.88ml       3
186//55    S       6.88    1203103 1203110 1203113 ML      3       ML_3            55s6.88ml       2
187//55    S       6.88    1203103 1203110 1203114 ML      4       ML_4            55s6.88ml       1
188
189// TEST DATA: Not working (Sand canyon)
190//5       S       23.5    1204813 1204814 1204815 HV      1       SD_1            5s23.5hv        1
191//5       S       23.5    1204813 1204816 1204818 ML      2       ML_2            5s23.5ml        5
192//5       S       23.5    1204813 1204816 1204819 ML      3       ML_3            5s23.5ml        4
193//5       S       23.5    1204813 1204816 1204820 ML      4       ML_4            5s23.5ml        3
194//5       S       23.5    1204813 1204816 1204821 ML      5       ML_5            5s23.5ml        2
195//5       S       23.5    1204813 1204816 1204822 ML      6       ML_6            5s23.5ml        1
196//5       N       23.5    1204813 1204823 1204824 OH      1       SD_2            5n23.5hv        1
197//5       N       23.5    1204813 1204825 1204826 OS      1       OS_1            5n23.5ml        6
198//5       N       23.5    1204813 1204825 1204827 OS      2       OS_2            5n23.5ml        5
199//5       N       23.5    1204813 1204825 1204828 OS      3       OS_3            5n23.5ml        4
200//5       N       23.5    1204813 1204825 1204829 OS      4       OS_4            5n23.5ml        3
201//5       N       23.5    1204813 1204825 1204830 OS      5       OS_5            5n23.5ml        2
202//5       N       23.5    1204813 1204825 1204831 OS      6       OS_6            5n23.5ml        1
203
204
205//5       S       23.5    1204813 1204816 1204817 ML      1       ML_1            5s23.5ml        6
206
207STATION * NetworkFactory::load_lds(const char * fName)
208{
209        /* Read loop meta data */
210        STATION *lds_map = (STATION *) calloc(sizeof(STATION), 1);
211        lds_map[0].lds = 1204813;
212        lds_map[0].line_num = 31;
213        lds_map[0].drop = 18;
214        LOOP *loop = new LOOP;
215        loop->loopID = 1204817;
216        loop->loop_loc = "ML_1";
217        loop->occ = 0;
218        loop->vol = 0;
219       
220        lds_map[0].loops.push_back(loop);
221
222        // Init Loop dataPack
223        lds_map[0].length = lds_map[0].loops.size() * 2 + CONTROL_DATA_LEN;
224        // init_loop_dataPack(lds_map);
225
226        lds_map[0].pos = 0;
227
228        lds_map[0].MlTotVol = 0;
229        lds_map[0].OppTotVol = 0;
230       
231        DataPacker dp;
232        lds_map[0].dataPack = dp.packData(&lds_map[0]);
233       
234
235        return lds_map;
236}
Note: See TracBrowser for help on using the repository browser.