/* This program is free software: you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public License
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
package org.opentripplanner.routing.edgetype;
import org.opentripplanner.gtfs.GtfsLibrary;
import org.opentripplanner.routing.core.RoutingRequest;
import org.opentripplanner.routing.core.State;
import org.opentripplanner.routing.core.StateEditor;
import org.opentripplanner.routing.core.TraverseMode;
import org.opentripplanner.routing.trippattern.TripTimes;
import org.opentripplanner.routing.vertextype.PatternArriveVertex;
import org.opentripplanner.routing.vertextype.PatternDepartVertex;
import com.vividsolutions.jts.geom.LineString;
/**
* Models waiting in a station on a vehicle. The vehicle is not permitted to change
* names during this time -- PatternInterlineDwell represents that case.
*/
public class PatternDwell extends TablePatternEdge implements OnBoardForwardEdge, OnBoardReverseEdge,
DwellEdge {
private static final long serialVersionUID = 1L;
private int stopIndex;
public PatternDwell(PatternArriveVertex from, PatternDepartVertex to, int stopIndex, TableTripPattern tripPattern) {
super(from, to);
this.stopIndex = stopIndex;
}
public String getDirection() {
return getPattern().getExemplar().getTripHeadsign();
}
public double getDistance() {
return 0;
}
public TraverseMode getMode() {
return GtfsLibrary.getTraverseMode(getPattern().getExemplar().getRoute());
}
public String getName() {
return GtfsLibrary.getRouteName(getPattern().getExemplar().getRoute());
}
public State traverse(State state0) {
//int trip = state0.getTrip();
TripTimes tripTimes = state0.getTripTimes();
int dwellTime = tripTimes.getDwellTime(stopIndex);
StateEditor s1 = state0.edit(this);
s1.setBackMode(getMode());
s1.incrementTimeInSeconds(dwellTime);
s1.incrementWeight(dwellTime);
return s1.makeState();
}
@Override
public State optimisticTraverse(State s0) {
int dwellTime = getPattern().getBestDwellTime(stopIndex);
StateEditor s1 = s0.edit(this);
s1.incrementTimeInSeconds(dwellTime);
s1.setBackMode(getMode());
s1.incrementWeight(dwellTime);
return s1.makeState();
}
@Override
public double timeLowerBound(RoutingRequest options) {
return getPattern().getBestDwellTime(stopIndex);
}
@Override
public double weightLowerBound(RoutingRequest options) {
return timeLowerBound(options);
}
public LineString getGeometry() {
return null;
}
public String toString() {
return "PatternDwell(" + super.toString() + ")";
}
public void setStopIndex(int stopIndex) {
this.stopIndex = stopIndex;
}
@Override
public int getStopIndex() {
return stopIndex;
}
public boolean allDwellsZero() {
return this.getPattern().scheduledTimetable.allDwellsZero(this.stopIndex);
}
}