Changeset 72 in tmcsimulator for branches


Ignore:
Timestamp:
09/07/2017 01:36:46 PM (9 years ago)
Author:
jtorres
Message:

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

Location:
branches/fep_client_cpp
Files:
3 added
3 edited

Legend:

Unmodified
Added
Removed
  • branches/fep_client_cpp/fep_client.cpp

    r71 r72  
    2828} 
    2929 
    30  
    3130void xfer_replys(CLIENT *clnt, FEP_LINE_LDS *lines, int lines_size, LDS_LOOP *ldsMap) 
    3231{ 
     32        printf("Lines_size %d\n", lines_size); 
    3333        int i, j; // i == line_index, j == lds_index 
    3434        void *rv; 
     
    5858                        uci_unix_simulation_time(uci_simulation_time());        // GMT time 
    5959                */ 
     60                fepReply.schedule_time = time(NULL); 
     61 
     62 
    6063                fepReply.user_info1 = lines[i].lineNum; 
    6164                fepReply.user_info2 = lines[i].lineNum; 
     
    134137         
    135138        /* Load data to be xfered to ATMS */ 
    136         int lines_size; 
     139        int lines_size = 0; 
     140        printf("Loading lines and ldsMap\n"); 
    137141        FEP_LINE_LDS *lines = load_lines(&lines_size, "./lines_atms.txt"); 
     142        printf("Done loading lines\n"); 
    138143        LDS_LOOP *ldsMap = load_lds("./lds_atms.txt"); 
     144        printf("Done loading lines and lds...\n"); 
    139145 
    140146        /* Transfer data to ATMS */ 
     
    142148 
    143149        /* Free allocated memory */ 
    144         free(lines); 
    145         free(ldsMap); 
    146150 
    147151        /* Destroy client */ 
  • branches/fep_client_cpp/network.h

    r71 r72  
    22#define NETWORK_H 
    33#include <vector> 
     4 
    45using namespace std; 
     6// the first byte is not considered in the calculation of "BYTE 2" 
     7const int Fixed_Byte_To_Checksum = 25; 
     8 
     9const int CONTROL_DATA_LEN = 27; 
     10 
     11char * const dp5[8] = { "ML_1", "ML_2", "ML_3", "ML_4", "ML_5", 
     12                                                "ML_6", "HOV_Lane", "FYW_Conn"}; 
     13char * const dp6[8] = { "OS_1", "OS_2", "OS_3", "OS_4", "OS_5", 
     14                                                "OS_6", "COLL_DIST_2", "COLL_DIST_OFF"}; 
     15char * const dp7[8] = { "DEMAND", "PASSAGE", "QUEUE", "RAMP_ON", 
     16                                                "RAMP_OFF", "RAMP_HOV", "COLL_DIST_1", "COLL_DIST_ON"}; 
     17char * const dp8[8] = { "SD_1", "SD_2", "SD_3", "SD_4", "SD_5", 
     18                                                "SD_6", "Pass_Vol_Count", "X"}; 
     19 
     20 
    521 
    622typedef struct loopagg LOOPAGG; 
  • branches/fep_client_cpp/network_factory.cpp

    r71 r72  
    11#include "network.h" 
    2  
     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   
    3154FEP_LINE_LDS * load_lines(int *size, const char * fName) 
    4155{ 
    5         FEP_LINE_LDS *lines = (FEP_LINE_LDS *) malloc(sizeof(FEP_LINE_LDS)); 
     156        FEP_LINE_LDS *lines = (FEP_LINE_LDS *) calloc(sizeof(FEP_LINE_LDS), 1); 
    6157        *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; 
    7166        return lines;    
    8167} 
    9168 
     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 
    10175LDS_LOOP * load_lds(const char * fName) 
    11176{ 
    12         LDS_LOOP *lds_map = (LDS_LOOP *) malloc(sizeof(LDS_LOOP)); 
     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 
    13213        return lds_map; 
    14214} 
Note: See TracChangeset for help on using the changeset viewer.