Search in sources :

Example 1 with OneBusAwayTripUpdate

use of com.google.transit.realtime.GtfsRealtimeOneBusAway.OneBusAwayTripUpdate in project onebusaway-application-modules by camsys.

the class GtfsRealtimeTripLibrary method applyTripUpdatesToRecord.

private void applyTripUpdatesToRecord(MonitoredResult result, BlockDescriptor blockDescriptor, List<TripUpdate> tripUpdates, VehicleLocationRecord record, String vehicleId, String bestTripId) {
    BlockInstance instance = blockDescriptor.getBlockInstance();
    BlockConfigurationEntry blockConfiguration = instance.getBlock();
    List<BlockTripEntry> blockTrips = blockConfiguration.getTrips();
    Map<String, List<TripUpdate>> tripUpdatesByTripId = MappingLibrary.mapToValueList(tripUpdates, "trip.tripId");
    long t = currentTime();
    int currentTime = (int) ((t - instance.getServiceDate()) / 1000);
    BestScheduleDeviation best = new BestScheduleDeviation();
    long lastStopScheduleTime = Long.MIN_VALUE;
    boolean singleTimepointRecord = false;
    List<TimepointPredictionRecord> timepointPredictions = new ArrayList<TimepointPredictionRecord>();
    for (BlockTripEntry blockTrip : blockTrips) {
        TripEntry trip = blockTrip.getTrip();
        AgencyAndId tripId = trip.getId();
        List<TripUpdate> updatesForTrip = tripUpdatesByTripId.get(tripId.getId());
        boolean tripUpdateHasDelay = false;
        // onBestTrip is only relevant if bestTripId is set, which indicates that the TripUpdates
        // came from the vehicleId map (as opposed to block index).
        boolean onBestTrip = bestTripId == null || tripId.getId().equals(bestTripId);
        if (updatesForTrip != null) {
            for (TripUpdate tripUpdate : updatesForTrip) {
                /**
                 * TODO: delete this code once all upstream systems have been
                 * migrated the new "delay" and "timestamp" fields.
                 */
                if (tripUpdate.hasExtension(GtfsRealtimeOneBusAway.obaTripUpdate) && onBestTrip) {
                    OneBusAwayTripUpdate obaTripUpdate = tripUpdate.getExtension(GtfsRealtimeOneBusAway.obaTripUpdate);
                    if (obaTripUpdate.hasDelay()) {
                        /**
                         * TODO: Improved logic around picking the "best" schedule deviation
                         */
                        int delay = obaTripUpdate.getDelay();
                        best.delta = 0;
                        best.isInPast = false;
                        best.scheduleDeviation = delay;
                        best.tripId = tripId;
                        tripUpdateHasDelay = true;
                    }
                    if (obaTripUpdate.hasTimestamp() && onBestTrip) {
                        best.timestamp = obaTripUpdate.getTimestamp() * 1000;
                    }
                }
                if (tripUpdate.hasDelay() && onBestTrip) {
                    /**
                     * TODO: Improved logic around picking the "best" schedule deviation
                     */
                    best.delta = 0;
                    best.isInPast = false;
                    best.scheduleDeviation = tripUpdate.getDelay();
                    best.tripId = tripId;
                    tripUpdateHasDelay = true;
                }
                if (tripUpdate.hasTimestamp() && onBestTrip) {
                    best.timestamp = tripUpdate.getTimestamp() * 1000;
                }
                for (StopTimeUpdate stopTimeUpdate : tripUpdate.getStopTimeUpdateList()) {
                    BlockStopTimeEntry blockStopTime = getBlockStopTimeForStopTimeUpdate(result, tripUpdate, stopTimeUpdate, blockTrip.getStopTimes(), instance.getServiceDate());
                    // loop through and store last stop time on trip
                    List<BlockStopTimeEntry> stopTimes = blockTrip.getStopTimes();
                    for (BlockStopTimeEntry bste : stopTimes) {
                        long scheduleTime = instance.getServiceDate() + bste.getStopTime().getArrivalTime() * 1000;
                        if (scheduleTime > lastStopScheduleTime) {
                            lastStopScheduleTime = scheduleTime;
                        }
                    }
                    if (blockStopTime == null)
                        continue;
                    StopTimeEntry stopTime = blockStopTime.getStopTime();
                    TimepointPredictionRecord tpr = new TimepointPredictionRecord();
                    tpr.setTimepointId(stopTime.getStop().getId());
                    tpr.setTripId(stopTime.getTrip().getId());
                    tpr.setTimepointScheduledTime(instance.getServiceDate() + stopTime.getArrivalTime() * 1000);
                    if (stopTimeUpdate.hasStopSequence()) {
                        tpr.setStopSequence(stopTimeUpdate.getStopSequence());
                    }
                    int currentArrivalTime = computeArrivalTime(stopTime, stopTimeUpdate, instance.getServiceDate());
                    int currentDepartureTime = computeDepartureTime(stopTime, stopTimeUpdate, instance.getServiceDate());
                    if (currentArrivalTime >= 0) {
                        if (onBestTrip) {
                            updateBestScheduleDeviation(currentTime, stopTime.getArrivalTime(), currentArrivalTime, best, tripId, vehicleId);
                        }
                        long timepointPredictedTime = instance.getServiceDate() + (currentArrivalTime * 1000L);
                        tpr.setTimepointPredictedArrivalTime(timepointPredictedTime);
                    }
                    if (currentDepartureTime >= 0) {
                        if (onBestTrip) {
                            updateBestScheduleDeviation(currentTime, stopTime.getDepartureTime(), currentDepartureTime, best, tripId, vehicleId);
                        }
                        long timepointPredictedTime = instance.getServiceDate() + (currentDepartureTime * 1000L);
                        tpr.setTimepointPredictedDepartureTime(timepointPredictedTime);
                    }
                    if (tpr.getTimepointPredictedArrivalTime() != -1 || tpr.getTimepointPredictedDepartureTime() != -1) {
                        timepointPredictions.add(tpr);
                    }
                }
            }
        }
        if (timepointPredictions.size() == 1 && tripUpdates.get(0).getStopTimeUpdateList().size() == 1) {
            singleTimepointRecord = true;
        }
        // tripUpdateHasDelay = true => best.scheduleDeviation is TripUpdate delay
        if ((timepointPredictions.size() > 0 && tripUpdateHasDelay) || singleTimepointRecord) {
            Set<AgencyAndId> records = new HashSet<AgencyAndId>();
            for (TimepointPredictionRecord tpr : timepointPredictions) {
                records.add(tpr.getTimepointId());
            }
            long tprStartTime = getEarliestTimeInRecords(timepointPredictions);
            for (StopTimeEntry stopTime : trip.getStopTimes()) {
                if (records.contains(stopTime.getStop().getId())) {
                    continue;
                }
                long predictionOffset = instance.getServiceDate() + (best.scheduleDeviation * 1000L);
                long predictedDepartureTime = (stopTime.getDepartureTime() * 1000L) + predictionOffset;
                long predictedArrivalTime = (stopTime.getArrivalTime() * 1000L) + predictionOffset;
                long scheduledArrivalTime = instance.getServiceDate() + stopTime.getArrivalTime() * 1000;
                long time = best.timestamp != 0 ? best.timestamp : currentTime();
                /*
             * if the timpepointrecord needs interpolated (one before, one after),
             * OR
             * we have a single Timepoint record and the arrival is
              * in the future and before the last stop
             */
                if ((predictedDepartureTime > time && predictedDepartureTime < tprStartTime) || (singleTimepointRecord && (predictedDepartureTime > time && scheduledArrivalTime <= lastStopScheduleTime))) {
                    TimepointPredictionRecord tpr = new TimepointPredictionRecord();
                    tpr.setTimepointId(stopTime.getStop().getId());
                    tpr.setTripId(stopTime.getTrip().getId());
                    tpr.setStopSequence(stopTime.getGtfsSequence());
                    tpr.setTimepointPredictedArrivalTime(predictedArrivalTime);
                    tpr.setTimepointPredictedDepartureTime(predictedDepartureTime);
                    tpr.setTimepointScheduledTime(scheduledArrivalTime);
                    timepointPredictions.add(tpr);
                }
            }
        }
    }
    record.setServiceDate(instance.getServiceDate());
    if (blockDescriptor.getStartTime() != null) {
        record.setBlockStartTime(blockDescriptor.getStartTime());
    }
    record.setScheduleDeviation(best.scheduleDeviation);
    if (best.timestamp != 0) {
        record.setTimeOfRecord(best.timestamp);
    }
    record.setTimepointPredictions(timepointPredictions);
}
Also used : AgencyAndId(org.onebusaway.gtfs.model.AgencyAndId) BlockTripEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockTripEntry) ArrayList(java.util.ArrayList) StopTimeEntry(org.onebusaway.transit_data_federation.services.transit_graph.StopTimeEntry) BlockStopTimeEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry) StopTimeUpdate(com.google.transit.realtime.GtfsRealtime.TripUpdate.StopTimeUpdate) List(java.util.List) ArrayList(java.util.ArrayList) BlockConfigurationEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockConfigurationEntry) BlockStopTimeEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry) HashSet(java.util.HashSet) TripUpdate(com.google.transit.realtime.GtfsRealtime.TripUpdate) OneBusAwayTripUpdate(com.google.transit.realtime.GtfsRealtimeOneBusAway.OneBusAwayTripUpdate) TripEntry(org.onebusaway.transit_data_federation.services.transit_graph.TripEntry) BlockTripEntry(org.onebusaway.transit_data_federation.services.transit_graph.BlockTripEntry) CoordinatePoint(org.onebusaway.geospatial.model.CoordinatePoint) BlockInstance(org.onebusaway.transit_data_federation.services.blocks.BlockInstance) TimepointPredictionRecord(org.onebusaway.realtime.api.TimepointPredictionRecord) OneBusAwayTripUpdate(com.google.transit.realtime.GtfsRealtimeOneBusAway.OneBusAwayTripUpdate)

Aggregations

TripUpdate (com.google.transit.realtime.GtfsRealtime.TripUpdate)1 StopTimeUpdate (com.google.transit.realtime.GtfsRealtime.TripUpdate.StopTimeUpdate)1 OneBusAwayTripUpdate (com.google.transit.realtime.GtfsRealtimeOneBusAway.OneBusAwayTripUpdate)1 ArrayList (java.util.ArrayList)1 HashSet (java.util.HashSet)1 List (java.util.List)1 CoordinatePoint (org.onebusaway.geospatial.model.CoordinatePoint)1 AgencyAndId (org.onebusaway.gtfs.model.AgencyAndId)1 TimepointPredictionRecord (org.onebusaway.realtime.api.TimepointPredictionRecord)1 BlockInstance (org.onebusaway.transit_data_federation.services.blocks.BlockInstance)1 BlockConfigurationEntry (org.onebusaway.transit_data_federation.services.transit_graph.BlockConfigurationEntry)1 BlockStopTimeEntry (org.onebusaway.transit_data_federation.services.transit_graph.BlockStopTimeEntry)1 BlockTripEntry (org.onebusaway.transit_data_federation.services.transit_graph.BlockTripEntry)1 StopTimeEntry (org.onebusaway.transit_data_federation.services.transit_graph.StopTimeEntry)1 TripEntry (org.onebusaway.transit_data_federation.services.transit_graph.TripEntry)1