root/applications/doprava/main_loop.cpp @ 836

Revision 836, 2.5 kB (checked in by smidl, 14 years ago)

details

Line 
1
2/*!
3\file
4\brief Distributed Traffic light Control Scenario
5\author Vasek Smidl
6
7 */
8
9#include "base/user_info.h"
10#include "base/loggers.h"
11#include "aimsun_bdm/aimsun_ds.h"
12#include "traffic_agent.h"
13
14using namespace bdm;
15
16int main ( int argc, char* argv[] ) {
17        const char *fname;
18        if ( argc>1 ) {fname = argv[1]; }
19        else { cout << "Missing configuration file.\n Usage: \n $> estimator config_file.cfg"<<endl; abort(); }
20        UIFile Cfg ( fname );
21
22        // SYSTEM TO CONTROL
23        AimsunDS Ds; //hard-coded so far
24
25        // AGENTS
26        Array<shared_ptr<Participant> > Ags;
27        UI::get ( Ags,Cfg, "agents" );
28
29        // LOGGER
30        shared_ptr<logger> L = UI::build <logger>( Cfg, "logger" );
31        if (!L) {L=new stdlog();} // DEFAULT LOGGER <== poor choice, use better ones
32
33        Config MsgStore;
34        MsgStore.setAutoConvert(true);
35        Setting& Queue = MsgStore.getRoot().add("queue", Setting::TypeList);
36
37        // REGISTER ACTIVE OBJECTS IN LOGGER
38        Ds.log_register ( *L, "DS" );
39        for ( int i=0; i<Ags.length(); i++ ) {
40                Ags ( i )->log_register ( *L,Ags(i)->_name() ); // estimate
41                Ags ( i )->ds_register(Ds);            // allows agents to update their datalinks
42        }
43        L->init();
44
45        vec glob_dt(Ds._drv()._dsize() );
46        vec glob_ut(Ds._urv()._dsize() );
47
48        // INITIALISATION OF UT
49        glob_ut[ 0] = 80; // cycle time
50        glob_ut[ 1] = 60; // offset 495
51        glob_ut[ 2] = 30; // ut[2]+ut[3]+ut[4] has to sum up to ut[0]
52        glob_ut[ 3] = 30;
53        glob_ut[ 4] = 20;
54    glob_ut[ 8] = 40; // offset 601
55        glob_ut[ 9] = 30; // ut[9]+ut[10]+ut[11] has to sum up to ut[0]
56        glob_ut[10] = 30;
57        glob_ut[11] = 20;
58
59        for ( int tK=0; tK < Ds.max_length(); tK++ ) {
60                Ds.log_write ( ); // write stuff to
61                Ds.getdata(glob_dt);
62               
63                for ( int i=0; i<Ags.length(); i++ ) {
64                        Ags(i) -> adapt(glob_dt);
65                }
66                for ( int i=0; i<Ags.length(); i++ ) {
67                        Ags(i) -> broadcast(Queue);
68                }
69                // parse message queue
70                for ( int m=Queue.getLength()-1; m>=0; m-- ) { // go backwards - last mesages are discarded
71                        for ( int i=0; i<Ags.length(); i++ ) {
72                                Setting& msg=Queue[m];
73                                string m_to=msg["to"];
74                                if (m_to==Ags(i)->_name()) {
75                                        Ags(i)->receive(msg);
76                                        Queue.remove(m);
77                                        break;
78                                        // message delivered;
79                                }
80                        }
81                }
82                if (Queue.getLength()>0){bdm_error("undelivered messages - probably unknown neighbours");}
83               
84                for ( int i=0; i<Ags.length(); i++ ) {
85                        Ags(i) -> act(glob_ut);
86                }
87               
88                L->step();
89                Ds.write(glob_ut);
90                Ds.step();                                                      // simulator step
91               
92                for ( int i=0; i<Ags.length(); i++ ) {
93                        Ags(i) -> step();
94                }
95               
96        }
97
98        L->finalize();
99
100        return 0;
101}
Note: See TracBrowser for help on using the browser.