source: proiecte/ptvs/src/vnsim/vehicular/routePlan/infrastructureRouted/InfrastructureNode.java @ 31

Last change on this file since 31 was 31, checked in by (none), 14 years ago
File size: 13.9 KB
Line 
1/************************************************************************************
2 * Copyright (C) 2008 by Politehnica University of Bucharest and Rutgers University
3 * All rights reserved.
4 * Refer to LICENSE for terms and conditions of use.
5 ***********************************************************************************/
6package vnsim.vehicular.routePlan.infrastructureRouted;
7
8
9import java.io.ObjectInputStream;
10import java.io.ByteArrayInputStream;
11import java.io.Serializable;
12import java.util.StringTokenizer;
13
14import java.util.ArrayList;
15import java.util.Vector;
16
17import vnsim.applications.trafficview.SimulatedCarInfo;
18import vnsim.applications.vitp.CarRunningVITP;
19import vnsim.applications.vitp.routing.RoutingPacket;
20import vnsim.core.Communicator;
21import vnsim.core.events.SendEvent;
22import vnsim.map.object.Cross;
23import vnsim.map.object.Globals;
24import vnsim.map.object.Road;
25import vnsim.vehicular.generator.Mobility;
26import vnsim.vehicular.routePlan.RouteComputingUtils;
27import vnsim.vehicular.simulator.CarInstance;
28import vnsim.vehicular.simulator.Location;
29import vnsim.vehicular.simulator.NotMovingPersonality;
30import vnsim.vehicular.simulator.RouteSegment;
31import vnsim.vehicular.simulator.RoutingUtils;
32import vnsim.vehicular.simulator.intersections.DirectedRoadSegment;
33import vnsim.vehicular.simulator.intersections.Intersection;
34
35
36
37
38
39public class InfrastructureNode extends CarRunningVITP {
40        Intersection correspondingIntersection = null;
41
42        Vector<DelayRecord> correspondingDelayRecords = new Vector<DelayRecord>();
43
44        public InfrastructureNode(int vehicleId, short roadIdx, short pointIdx,
45                        Intersection p) {
46                super(vehicleId, (byte) 0, 0.0, roadIdx, pointIdx, (byte) 0, 0.0);
47                this.correspondingIntersection = p;
48
49                for (int i = 0; i < correspondingIntersection.segments.size(); i++) {
50                        for (int j = 0; j < Globals.routePlanConstants.delays.size(); j++) {
51                                if (Globals.routePlanConstants.delays.get(j).equals(correspondingIntersection.segments.get(i))) {
52                                        this.correspondingDelayRecords.add(Globals.routePlanConstants.delays.get(j));
53                                        break;
54                                }
55                        }
56                }
57                if (this.correspondingIntersection.segments.size() != this.correspondingDelayRecords.size()) {
58                        System.out.println("Err: delayrecords are not properly initialized");
59                        System.exit(0);
60
61                }
62
63        }
64
65        public void onReceive(byte[] bytesReceived, Serializable m, Communicator sender) {
66                // super.onReceive(bytesReceived);
67                // System.out.println("SEMAFOR on receive!");
68                if (!isEquipped || bytesReceived == null)
69                        return;
70                // is it a VITP packet?
71                byte header = bytesReceived[0];
72               
73                byte[] message = null;
74               
75                switch (header) {
76                case Globals.PROT_NEIGHBOR_DISCOVERY:
77                        // ByteBuffer bb = ByteBuffer.wrap(bytesReceived, 1,
78                        // bytesReceived.length-1);
79                       
80                        super.onReceive(bytesReceived, m, sender);
81//                      SimulatedCarInfo sc = new SimulatedCarInfo();
82//                      message = new byte[bytesReceived.length - 1];
83//                      for (int i = 0; i < message.length; i++) {
84//                              message[i] = bytesReceived[i + 1];
85//                      }
86//                      sc.wrap(message);
87//                      boolean added = false;
88//                      for (int i = 0; i < trafficDB.size(); i++)
89//                              if ((trafficDB.get(i)).getVehicleId() == sc.getVehicleId()) {
90//                                      synchronized (trafficDB) {
91//                                              trafficDB.set(i, sc);
92//                                              // System.out.println("Insert "+dc.getVehicleId() +" at
93//                                              // "+i);
94//                                              added = true;
95//                                      }
96//                                      break;
97//                              }
98//                      if (!added)
99//                              synchronized (trafficDB) {
100//                                      trafficDB.add(sc);
101//                                      // System.out.println("Insert "+dc.getVehicleId() +" at
102//                                      // "+(Globals.neighbors.size()-1));
103//                              }
104                        break;
105
106                case Globals.VITP_PROT:
107//                      // System.out.println("I AM :"+vehicleId+"; RECEIVED VITP!");
108                        super.onReceive(bytesReceived, m, sender);
109//                      message = new byte[bytesReceived.length - 1];
110//                      for (int i = 0; i < message.length; i++) {
111//                              message[i] = bytesReceived[i + 1];
112//                      }
113//                      try {
114//                              ObjectInputStream ois = new ObjectInputStream(
115//                                              new ByteArrayInputStream(message));
116//                              RoutingPacket rp = (RoutingPacket) ois.readObject();
117//
118//                              r.postMessageFromBelow(rp);
119//
120//                      } catch (Exception ex) {
121//                              System.out.println("EXCEPTION CarRunningVITP:" + ex.toString());
122//                              ex.printStackTrace();
123//                              return;
124//                      }
125                        break;
126                case Globals.ROAD_PLANNING_PROT:
127                         System.out.println("I AM INFRASTRUCTURE RECEIVED REQUEST!");
128                        message = new byte[bytesReceived.length - 1];
129                        for (int i = 0; i < message.length; i++) {
130                                message[i] = bytesReceived[i + 1];
131                        }
132                        String reply = parseRoutingRequest(message);
133                        if (reply != null) {
134                                this.broadcastRoadPacket(reply);
135                        }
136                        break;
137                }
138        }
139
140        public String parseRoutingRequest(byte[] rec) {
141                String replyBody = null;
142                String body = new String(rec);
143
144                 System.out.println("Struct cu id=" + this.vehicleId
145                 + " primesc un mesaj:" + body+ "r="+this.roadIdx+
146               
147                 "p="+this.pointIdx);
148                StringTokenizer st = null;
149                boolean cont = false;
150                int cr, cp2, cp1;
151                try {
152                        st = new StringTokenizer(body);
153                        String type = null;
154                        type = st.nextToken();
155                        if (!type.equals("DR")) {
156                                return null;
157                        }
158                        st.nextToken();
159
160                        Cross c;
161                        cr = (new Integer(st.nextToken())).intValue();
162                        cp1 = (new Integer(st.nextToken())).intValue();
163                        cp2 = (new Integer(st.nextToken())).intValue();
164                        // System.out.println("cere sem de pe sourceRoadIdx "+cr+"p1="+cp1+" p2="+cp2);
165                        if ((cr == this.getRealPos().getRoadIdx())
166                                        && (cp2 == this.getRealPos().getPointIdx())) {
167                                cont = true;
168                        } else {
169
170                                for (int i = 0; i < Globals.map.roads.get(this.getRealPos()
171                                                .getRoadIdx()).crosses.size(); i++) {
172                                        c = Globals.map.roads.get(this.getRealPos().getRoadIdx()).crosses
173                                                        .get(i);
174                                        if (c.getCrossRoadIndex() == cr
175                                                        && c.getCrossPointIndex() == cp2
176                                                        && (c.getPointIndex() == this.getRealPos()
177                                                                        .getPointIdx())) {
178                                                cont = true;
179                                                break;
180                                        }
181                                }
182                        }
183
184                } catch (Exception e) {
185
186                        return null;
187                }
188
189                if (!cont) {
190                         System.out.println("Struct " + this.vehicleId
191                         + " got messg not for me but for" + cr + " " + cp2);
192                        return null;
193                }
194                try {
195
196                        // replyBody = new String(body);
197                        // replyBody = replyBody.substring(replyBody.indexOf(' '));
198                        // replyBody="RDR "+replyBody;
199                        replyBody = "R" + body;
200                        int rd, pt;
201
202                        RouteComputingUtils rc = new RouteComputingUtils();
203                        try {
204
205                                rd = (new Integer(st.nextToken())).intValue();
206                                pt = (new Integer(st.nextToken())).intValue();
207                                boolean nextToMe = false;
208                                int p1, p2;
209                                Road r = Globals.map.roads.get(this.getRealPos().getRoadIdx());
210                                if (this.getRealPos().getRoadIdx() == rd) {
211                                        // System.out.println("destination e pe str cu mine");
212                                        if (pt < this.getRealPos().getPointIdx()) {
213                                                p1 = pt;
214                                                p2 = this.getRealPos().getPointIdx();
215                                        } else {
216                                                p2 = pt;
217                                                p1 = this.getRealPos().getPointIdx();
218                                        }
219                                        boolean foundCross = false;
220
221                                        for (int i = 0; i < r.crosses.size(); i++) {
222                                                if ((r.crosses.get(i).getPointIndex() > p1)
223                                                                && ((r.crosses.get(i).getPointIndex()) < p2)) {
224                                                        // System.out
225                                                        // .println("Gasesc un cros pana in destination in pct "
226                                                        // + r.crosses.get(i).getPointIndex());
227                                                        foundCross = true;
228                                                        break;
229                                                }
230                                        }
231                                        if (!foundCross) {
232                                                nextToMe = true;
233                                                replyBody = replyBody.concat(" " + rd + " "
234                                                                + this.getRealPos().getPointIdx() + " " + pt);
235                                                // System.out.println(" Nu am gasit cross intre noi");
236
237                                        }
238
239                                }
240                                if (!nextToMe) {
241                                        // System.out.println("caut in crossuri");
242                                        for (int i = 0; i < r.crosses.size(); i++) {
243                                                if ((r.crosses.get(i).getCrossRoadIndex() == rd)
244                                                                && (r.crosses.get(i).getPointIndex() == this.pointIdx)) {
245                                                        // System.out.println("Am cross cu strada aia ");
246                                                        if (pt < r.crosses.get(i).getCrossPointIndex()) {
247                                                                p1 = pt;
248                                                                p2 = r.crosses.get(i).getCrossPointIndex();
249                                                        } else {
250                                                                p2 = pt;
251                                                                p1 = r.crosses.get(i).getCrossPointIndex();
252                                                        }
253                                                        boolean foundCross = false;
254                                                        Road tpR = Globals.map.roads.get(rd);
255                                                        for (int j = 0; j < tpR.crosses.size(); j++) {
256                                                                if ((tpR.crosses.get(j).getPointIndex() > p1)
257                                                                                && ((tpR.crosses.get(j).getPointIndex()) < p2)) {
258                                                                        // System.out
259                                                                        // .println("Mai am un cross pana la punctul
260                                                                        // ala pe cross road");
261                                                                        foundCross = true;
262                                                                        break;
263                                                                }
264                                                        }
265                                                        if (!foundCross) {
266                                                                nextToMe = true;
267                                                                replyBody = replyBody.concat(" " + rd + " "
268                                                                                + r.crosses.get(i).getCrossPointIndex()
269                                                                                + " " + pt);
270                                                                // System.out
271                                                                // .println("Nu mai e cross pe noua strada intre
272                                                                // mine si destination");
273                                                                break;
274                                                        }
275
276                                                }
277                                        }
278
279                                }
280
281                                if (!nextToMe)
282
283                                {
284                                        // System.out.println("NU E LANGA MINE");
285                                        ArrayList<Location> points = rc
286                                                        .dijkstraPathWithDelay(new Location(this
287                                                                        .getRoadIdx(), this.getPointIdx()),
288                                                                        new Location(rd, pt),
289                                                                        new Location(cr, cp2),
290                                                                        new Location(cr, cp1));
291                                        if (points != null) {
292                                                // System.out.println(" am points:" +points);
293                                                ArrayList<RouteSegment> ret = RoutingUtils
294                                                                .mergeRoute(points);
295                                                // System.out.println(" am merged points:" + ret);
296                                                ret = RoutingUtils.splitRoute(ret);
297                                                // System.out.println(" am ruta:" + ret);
298                                                int ii = 0;
299                                                while (ii < ret.size()) {
300                                                        if (ret.get(ii).pt1 == ret.get(ii).pt2) {
301                                                                // System.out.println(" scot din ruta:" + ret+"
302                                                                // poz "+ii);
303                                                                ret.remove(ii);
304                                                        } else {
305                                                                ii++;
306                                                        }
307                                                }
308
309                                                replyBody = replyBody.concat(" " + ret.get(0).roadIndex
310                                                                + " " + ret.get(0).pt1 + " " + ret.get(0).pt2);
311                                                // System.out.println(" ret "+ret.get(0)+"repl
312                                                // "+replyBody);
313                                                // System.out.println("Gasesc ruta");
314                                        } else {
315                                                System.out.println("Nu gasesc ruta");
316                                        }
317
318                                        // System.out.println("Struct cu id=" + this.getVehicleId()
319                                        // + " raspund cu " + replyBody);
320
321                                }
322                        } catch (Exception e) {
323                                System.out.println("Incorect format for the request");
324                                e.printStackTrace();
325                                return null;
326                        }
327
328                } catch (Exception e) {
329                        e.printStackTrace();
330                        return null;
331                }
332                // System.out.println("returnez: " + replyBody);
333                return replyBody;
334
335        }
336
337        public Intersection getCurrespondingIntersection() {
338                return correspondingIntersection;
339        }
340
341        public void updateDelays() {
342                for (int i = 0; i < this.correspondingDelayRecords.size(); i++) {
343
344                        int p1, p2, r, nr = 0;
345                        r = this.correspondingDelayRecords.get(i).roadSegment.roadIndex;
346                        p2 = this.correspondingDelayRecords.get(i).roadSegment.pointIndex;
347                        p1 = this.correspondingDelayRecords.get(i).previosCrossPoint;
348                        CarInstance car;
349                        if (p1 < p2) {
350                                for (int j = 0; j < Globals.map.roads.get(r).carsOnThisRoad
351                                                .size(); j++) {
352                                        car = Globals.map.roads.get(r).carsOnThisRoad.get(j);
353                                        if ((car.getPointIdx() >= p1) && (car.getPointIdx() <= p2)) {
354                                                if (car.route[car.routeIndex].pt1 < car.route[car.routeIndex].pt2) {
355                                                        nr++;
356                                                }
357                                        }
358                                }
359                        } else {
360                                for (int j = 0; j < Globals.map.roads.get(r).carsOnThisRoad
361                                                .size(); j++) {
362                                        car = Globals.map.roads.get(r).carsOnThisRoad.get(j);
363                                        if ((car.getPointIdx() <= p1) && (car.getPointIdx() >= p2)) {
364                                                if (car.route[car.routeIndex].pt1 > car.route[car.routeIndex].pt2) {
365                                                        nr++;
366                                                }
367                                        }
368                                }
369
370                        }
371                        //                      System.out.println("infrastruct" + this.getVehicleId() + "nr=" + nr
372                        //                                      + "   road r=" + r + " p1=" + p1 + " p2=" + p2 + " dr="
373                        //                                      + this.mySegments.get(i).location);
374
375                        long d = 0L;
376
377                        d = (long) (nr * 60 * 60);
378                        d = (d / (this.correspondingDelayRecords.get(i).getCapacity()));
379                        this.correspondingDelayRecords.get(i).setDelay(d);
380                }
381
382        }
383       
384        public static void createInfrastructureNodes(){
385                for (int i = 0; i < Globals.map.allIntersections.size(); i++) {
386                        Intersection it = Globals.map.allIntersections.get(i);
387                        DirectedRoadSegment dr = it.segments.get(0);
388                        CarInstance car = null;
389
390                        car = Mobility.createNewInvisibleCar(dr.roadIndex,
391                                        dr.pointIndex, 0, 0, 0.0, new NotMovingPersonality(),
392                                        0.0, Globals.engine.lastCarID, dr.roadIndex, dr.pointIndex + 1,
393                                        new RouteSegment((short) dr.roadIndex,
394                                                        (short) dr.pointIndex,
395                                                        (short) (dr.pointIndex + 1)), 5);
396                        if (car != null) {
397                                Globals.engine.lastCarID++;
398                                System.out.println("Created invisible carReceivingMsg id="
399                                                + (Globals.engine.lastCarID - 1) + " at road " + dr.roadIndex
400                                                + " point " + dr.pointIndex);
401                                addInfrastructureNode(car, it);
402                        } else {
403                                System.out.println("nu am putut creea o struct");
404                        }
405
406                }
407               
408        }
409        public static void addInfrastructureNode(CarInstance car, Intersection pos) {
410                if (car == null)
411                        return;
412
413                synchronized (Globals.engine.cars) {
414
415                        InfrastructureNode ic;
416
417                        if (car.routingType == 5) {
418                                if (Globals.engine.crtTime == 0) {
419
420                                        ic = new InfrastructureNode(car.ID, car.getRoadIdx(), car.getPointIdx(),
421                                                        pos);
422                                        ic.setTimestamp(Globals.engine.crtTime);
423                                        ic.setRealPos(car);
424                                        Globals.engine.cars.add(ic);
425                                        Globals.engine.infrastructure.add(ic);
426                                        ic.init();
427                                       
428                                } else {
429                                        int poz = Globals.engine.cars.indexOf(new SimulatedCarInfo(car.ID));
430                                        if (poz == -1) {
431                                                ic = new InfrastructureNode(car.ID, car.getRoadIdx(),
432                                                                car.getPointIdx(), pos);
433                                                ic.setTimestamp(Globals.engine.crtTime);
434                                                ic.setRealPos(car);
435                                                Globals.engine.schedEvent(new SendEvent(Globals.engine.crtTime + 1, ic,
436                                                                SimulatedCarInfo.STANDARD_MESSAGE_ID));
437                                                Globals.engine.cars.add(ic);
438                                                Globals.engine.infrastructure.add(ic);
439                                                ic.init();
440                                               
441                                        } else {
442                                                ((SimulatedCarInfo) Globals.engine.cars.get(poz)).setRealPos(car);
443                                               
444                                        }
445                                }
446
447                        }
448                }
449        }
450
451       
452
453}
Note: See TracBrowser for help on using the repository browser.