/** * Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.onebusaway.transit_data.model.blocks; import java.io.Serializable; import org.onebusaway.geospatial.model.CoordinatePoint; import org.onebusaway.transit_data.model.StopBean; /** * Status of a particular block instance, including real-time location * information when available. * * @author bdferris * @see BlockDetailsBean */ public final class BlockStatusBean implements Serializable { private static final long serialVersionUID = 1L; private BlockBean block; /**** * These are fields that we can supply from schedule data ****/ private long serviceDate; private double scheduledDistanceAlongBlock = Double.NaN; private double totalDistanceAlongBlock = Double.NaN; /**** * These are fields that we can supply from schedule data, but also update * from real-time data when available ****/ private boolean inService = false; private String status; private CoordinatePoint location; private BlockTripBean activeTrip; private StopBean closestStop; /** * In seconds */ private int closestStopTimeOffset; /**** * These are fields that we can supply only from real-time data ****/ private boolean predicted = false; private long lastUpdateTime; private double scheduleDeviation = Double.NaN; private double distanceAlongBlock = Double.NaN; private String vehicleId; public BlockBean getBlock() { return block; } public void setBlock(BlockBean block) { this.block = block; } public long getServiceDate() { return serviceDate; } public void setServiceDate(long serviceDate) { this.serviceDate = serviceDate; } /** * The vehicle's scheduled distance along the block. * * @return distance, in meters */ public double getScheduledDistanceAlongBlock() { return scheduledDistanceAlongBlock; } public void setScheduledDistanceAlongBlock(double scheduledDistanceAlongBlock) { this.scheduledDistanceAlongBlock = scheduledDistanceAlongBlock; } public double getTotalDistanceAlongBlock() { return totalDistanceAlongBlock; } public void setTotalDistanceAlongBlock(double totalDistanceAlongBlock) { this.totalDistanceAlongBlock = totalDistanceAlongBlock; } public boolean isInService() { return inService; } public void setInService(boolean inService) { this.inService = inService; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public CoordinatePoint getLocation() { return location; } public void setLocation(CoordinatePoint location) { this.location = location; } public BlockTripBean getActiveTrip() { return activeTrip; } public void setActiveTrip(BlockTripBean activeTrip) { this.activeTrip = activeTrip; } public StopBean getClosestStop() { return closestStop; } public void setClosestStop(StopBean closestStop) { this.closestStop = closestStop; } /** * The time offset, in seconds, from the closest stop to the current position * of the transit vehicle among the stop times of the current block. If the * number is positive, the stop is coming up. If negative, the stop has * already been passed. * * @return time, in seconds */ public int getClosestStopTimeOffset() { return closestStopTimeOffset; } /** * See description in {@link #getClosestStopTimeOffset()}. * * @param closestStopTimeOffset the time offset from the closest stop, in * seconds */ public void setClosestStopTimeOffset(int closestStopTimeOffset) { this.closestStopTimeOffset = closestStopTimeOffset; } public boolean isPredicted() { return predicted; } public void setPredicted(boolean predicted) { this.predicted = predicted; } public void setLastUpdateTime(long lastUpdateTime) { this.lastUpdateTime = lastUpdateTime; } /** * @return the time we last heard from the bus (Unix-time) */ public long getLastUpdateTime() { return lastUpdateTime; } public boolean isScheduleDeviationSet() { return !Double.isNaN(scheduleDeviation); } public double getScheduleDeviation() { return scheduleDeviation; } public void setScheduleDeviation(double scheduleDeviation) { this.scheduleDeviation = scheduleDeviation; } /** * @return true if {@link #getDistanceAlongBlock()} has been set */ public boolean isDistanceAlongBlockSet() { return !Double.isNaN(distanceAlongBlock); } /** * The vehicle's distance along the block. * * @return distance, in meters */ public double getDistanceAlongBlock() { return distanceAlongBlock; } /** * See description in {@link #getDistanceAlongBlock()}. * * @param distanceAlongBlock */ public void setDistanceAlongBlock(double distanceAlongBlock) { this.distanceAlongBlock = distanceAlongBlock; } public String getVehicleId() { return vehicleId; } public void setVehicleId(String vehicleId) { this.vehicleId = vehicleId; } /**** * ****/ public double computeBestDistanceAlongBlock() { if( isDistanceAlongBlockSet()) return getDistanceAlongBlock(); return getScheduledDistanceAlongBlock(); } }