/************************************************************************************ * Copyright (C) 2008 by Politehnica University of Bucharest and Rutgers University * All rights reserved. * Refer to LICENSE for terms and conditions of use. ***********************************************************************************/ package vnsim.vehicular.simulator.intersections; import java.io.File; import java.util.ArrayList; import vnsim.map.object.Globals; import vnsim.vehicular.simulator.*; public class IntersectionWithTrafficLights extends Intersection { /** serialVersionUID */ private static final long serialVersionUID = -5883719321862303634L; // indices corresponding with the "segments" Vector // public ArrayList lightInfos; public ArrayList currentColor; // 1=RED, 2=YELLOW, 3=GREEN public int lastCycleStartTime = 0; public int cycleLength; public void addCrossingSegment(DirectedRoadSegment drs) { if (segments == null) { segments = new ArrayList(); currentColor = new ArrayList(); } if (!segments.contains(drs)) { segments.add(drs); currentColor.add(0); } } // public void addTrafficLightInfo(TrafficLightInfo info) { // if(lightInfos==null) { // lightInfos=new ArrayList (); // } // lightInfos.add(info); // } public synchronized boolean isGreen(RouteSegment src) { for (int i = 0; i < segments.size(); i++) { if (segments.get(i).isSameSegment(src)) { if (currentColor.get(i).intValue() == 3) return true; else return false; } } System.err.println("ERROR! isGreen called, but segment not found in intersection!"); System.err.println("->"+src.roadIndex+" "+src.pt1+" "+src.pt2); for (int i = 0; i < segments.size(); i++) { System.err.println("\t->"+segments.get(i).roadIndex+" "+segments.get(i).pointIndex); } return false; } public synchronized boolean isGreen(int k) { if (currentColor.get(k).intValue() == 3) return true; return false; } public synchronized boolean isRed(int k) { if (currentColor.get(k).intValue() == 1) return true; return false; } public synchronized boolean isYellow(RouteSegment src) { for (int i = 0; i < segments.size(); i++) { if (segments.get(i).isSameSegment(src)) { if (currentColor.get(i).intValue() == 2) return true; else return false; } } System.out.println("ERROR! isYellow called, but segment not found in intersection!"); return false; } public boolean mustStop(RouteSegment src, RouteSegment dst) { return false; } public boolean havePriority(RouteSegment seg1, RouteSegment seg2) { return false; } public synchronized ArrayList yieldFor(RouteSegment seg1, RouteSegment seg2) { // a vehicle coming on "seg1", going on "seg2" // must yield to vehicles coming on which segments? ArrayList ret = new ArrayList(); int i; for (i = 0; i < segments.size(); i++) { if (segments.get(i).isSameSegment(seg1)) break; } int j; for (j = 0; j < segments.size(); j++) { if (segments.get(j).isSameSegment(seg2)) break; } if (i == segments.size() || j == segments.size()) System.out.println("*** ERROR! yieldFor - wrong parameters!"); for (int k = 0; k < segments.size(); k++) { if (k == i || k == j) continue; if (isOrder(i, k, j) && isGreen(k)) { ret.add(segments.get(k)); } } return ret; } public boolean isLeftTurn(RouteSegment seg1, RouteSegment seg2) { DirectedRoadSegment s1 = null, s2 = null; int i; for (i = 0; i < segments.size(); i++) { if (segments.get(i).isSameSegment(seg1)) { s1 = segments.get(i); break; } } int j; for (j = 0; j < segments.size(); j++) { if (segments.get(j).isSameSegment(seg2)) { s2 = segments.get(j); break; } } if (s1 != null && s1.left != null && s1.left.equals(s2)) return true; return false; } // returns the maximum allowed speed when the light is green public double getMaximumSpeed(RouteSegment seg1, RouteSegment seg2) { return 20.0; } public double getInfluenceDistance(RouteSegment seg1, RouteSegment seg2) { return 0.100; } public double getInfluenceDistanceLaneChange(RouteSegment seg1, RouteSegment seg2) { return 0.200; } public boolean hasTrafficLights() { return true; } public String toString() { String ret = ""; ret = ret + segments + " - " + currentColor; return ret; } public void step(int crtTime) { int thisSec = (int) (crtTime / (Globals.executionFPS)); int prevSec = (int) ((crtTime - 1) / (Globals.executionFPS)); int aux = thisSec % this.cycleLength; int prev = prevSec % this.cycleLength; synchronized (this) { this.currentColor = new ArrayList(); for (int k = 0; k < this.segments.size(); k++) { TrafficLightInfo info = segments.get(k).lightInfo; int color = info.getColor(aux); this.currentColor.add(new Integer(color)); if (info.getColor(prev) != color) { segments.get(k).changePhase(null, crtTime, color); } } } } }