root/applications/doprava/traffic_agent.h @ 887

Revision 842, 5.8 kB (checked in by smidl, 15 years ago)

doprava is now working

Line 
1/*!
2  \file
3  \brief Traffic Light Agents
4  \author Vaclav Smidl.
5*/
6
7#ifndef TRAGE_H
8#define TRAGE_H
9
10
11#include <base/participants.h>
12       
13using namespace bdm;
14
15//! detector of traffic variables
16class Detector{
17        public:
18                string name;             //! detector name
19                int distance;                //! distance from stop-line
20
21                //! function loading info from Setting
22                void from_setting(const Setting &set){
23                        UI::get(name,set,"name",UI::compulsory);
24                        UI::get(distance,set,"distance",UI::compulsory);
25                       
26                }
27};
28
29//! detector fo incomming flow
30class DetectorIn : public Detector{
31        public:
32        Array<string> to_sg; // to signal plans
33        void from_setting(const Setting &set){
34                Detector::from_setting(set);
35                UI::get(to_sg, set, "to_sg", UI::compulsory);
36        }
37};
38
39//! structure for output detectors
40class RequestOut {
41        public:
42        string to; // agent
43        Array<string> detectors; //detectors
44        void from_setting(const Setting &set){
45                UI::get(detectors,set,"detectors",UI::compulsory);
46                UI::get(to, set, "to", UI::compulsory);
47        }
48};
49
50
51//! class with physical information about a signal group
52class SignalGroup {
53        public:
54                string name;                 //! names of the group
55                Array<Detector> detectors;   //! (possible) detectors
56               
57                //! function that loads information from Setting
58                void from_setting(const Setting &set);         
59};
60
61//! class that operates on a signal group
62class SignalGroupHandler {
63        protected:
64                //! pointer to physical signal group
65                SignalGroup *sg;
66               
67        public:
68                //! actual data from the relevant signal group
69                vec det_data;
70                //! description of det_data
71                RV rv_det_data;
72                //! link from global measured data
73                datalink ds2data;
74        public:
75                void connect_sg(SignalGroup &sg0, const string &agent_name){
76                        sg=&sg0;
77                        for (int i=0;i<sg->detectors.length();i++){
78                                rv_det_data.add(RV(agent_name +"_"+ sg->detectors(i).name, 2)); //TODO intensity occupancy
79                        }
80                       
81                }
82               
83                //! arbitrary function that computes the need of the signal group for green light in common units (number of waiting cars?)
84                double expected_load(){
85                        if (det_data.length()>0){
86                                return det_data(0); // whatever
87                        } else {
88                                return 1.0; // mean value
89                        }
90                }
91};
92
93class RequestHandler{
94        protected:
95                RequestOut *rq;
96        public:
97                RV rv;
98        public:
99                void connect_request(RequestOut &rq0, const string &agent_name){
100                        rq=&rq0;
101                        for (int i=0;i<rq->detectors.length();i++){
102                                rv.add(RV(rq->detectors(i), 2)); //TODO intensity occupancy
103                        }
104                }
105};
106
107/*!
108\brief  Basic Traffic Agent
109
110*/
111class BaseTrafficAgent : public Participant {
112        protected:
113                //! Signal Groups
114                Array<SignalGroup> sg;
115
116                Array<SignalGroupHandler> sgh;
117                                                                               
118                //!data from messages
119                vec input_data;
120               
121                //! decription of msg_data
122                RV input_rv;
123               
124                //! data to broadcast
125                vec output_data;
126               
127                //! description of broadcast dataind
128                RV output_rv;
129               
130                //! datalink from DS to output variables
131                datalink ds2output;
132                                       
133                //! output recepient
134                Array<RequestOut> requests;
135                Array<RequestHandler> request_handler;
136               
137                //! action description
138                RV action_rv;
139               
140                datalink_part action2ds;
141               
142        public:
143                void validate(){
144                        // write internal checks if all was loaded OK
145                       
146                        // set action variable == this is a feature of the agent!
147                        action_rv = RV(name+"_Tc", 1); // <======= example
148                }
149                void receive(const Setting &msg){
150                        string what;
151                        UI::get(what, msg, "what", UI::compulsory);
152                       
153                        if (what=="data"){ //
154                                // field data
155                                // extract decription of teh received datavector
156                                shared_ptr<RV> rv=UI::build<RV>(msg,"rv",UI::compulsory);
157                                // find if it is needed
158                                ivec ind=rv->dataind(input_rv); // position of rv in in_rv;
159                                if (ind.length()>0){ //data are interesting
160                                        vec dt;
161                                        UI::get(dt, msg, "value",UI::compulsory); // get data
162                                        set_subvector(input_data, ind,  dt); //check size?
163                                }                               
164                        } else {
165                                bdm_warning("Unknown message of type "+what);
166                        }
167                }
168                void log_register(logger &L, const string &prefix){
169                        root::log_register ( L, prefix );
170                        logrec->ids.set_size(sg.length()+2);
171                        int i;
172                        for (i=0;i <sg.length(); i++) {
173                                logrec->ids(i)=logrec->L.add_vector(sgh(i).rv_det_data, "");
174                        }
175                        logrec->ids(i)=logrec->L.add_vector(input_rv,"in_"); i++;
176                        logrec->ids(i)=logrec->L.add_vector(output_rv,"out_");
177                }
178                void log_write() const {
179                        int i;
180                        for (i=0;i <sg.length(); i++) {
181                                logrec->L.log_vector(logrec->ids(i), sgh(i).det_data);
182                        }
183                        logrec->L.log_vector(logrec->ids(i),input_data); i++;
184                        logrec->L.log_vector(logrec->ids(i),output_data); i++;
185                }
186               
187                void broadcast(Setting& set){
188                        // broadcast data to all neighbours
189                        for (int i=0; i<request_handler.length(); i++){
190                                Setting &msg =set.add(Setting::TypeGroup);
191                                RequestHandler &R=request_handler(i);
192                               
193                                // copy from create message
194                                // create msg with fields {to=..., what=data, rv=..., value = ...}
195                                UI::save ( requests(i).to, msg, "to");
196                                UI::save ( (string)"data", msg, "what");
197                                UI::save ( &R.rv, msg, "rv");
198                                UI::save(output_data, msg, "value");
199                        }
200                }
201                void adapt(const vec &glob_dt){
202                        // copy data from global vector to sSGHandlers
203                        for (int i=0; i<sgh.length();i++){
204                                sgh(i).ds2data.filldown(glob_dt, sgh(i).det_data);
205                        }
206                        //copy data fro neighbours
207                        ds2output.filldown(glob_dt, output_data);
208                        // copy sg_length ... and others...
209                }
210                void act(vec &glob_ut){
211                        vec needs(sgh.length());
212                        for (int i=0; i<sgh.length();i++){
213                                needs(i) = sgh(i).expected_load();
214                        }
215                        vec action; // trivial stuff
216                        action2ds.filldown(action,glob_ut);
217                }
218               
219                void ds_register(const DS &ds){
220                        //register ds2output
221                        ds2output.set_connection(output_rv, ds._drv());
222                        output_data.set_size(output_rv._dsize());
223                        for (int i=0; i<sgh.length(); i++){
224                                sgh(i).ds2data.set_connection(sgh(i).rv_det_data, ds._drv());
225                        }
226                        action2ds.set_connection( ds._urv(), action_rv);
227                }
228               
229                void from_setting(const Setting &set);
230};
231UIREGISTER(BaseTrafficAgent);
232
233#endif //TRAGE_H
Note: See TracBrowser for help on using the browser.