Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 34 additions & 23 deletions lib/dotcom/schedule_finder/upcoming_departures.ex
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,7 @@ defmodule Dotcom.ScheduleFinder.UpcomingDepartures do
}) do
trip = predicted_schedule |> PredictedSchedule.trip()
stop_sequence = PredictedSchedule.stop_sequence(predicted_schedule)
vehicle_at_stop_status = PredictedSchedule.vehicle_at_stop_status(predicted_schedule)

trip_details =
trip_details(%{
Expand All @@ -263,7 +264,8 @@ defmodule Dotcom.ScheduleFinder.UpcomingDepartures do
predicted_schedule: predicted_schedule,
route_type: route_type,
status: PredictedSchedule.status(predicted_schedule),
now: now
now: now,
vehicle_at_stop_status: vehicle_at_stop_status
}),
arrival_substatus:
arrival_substatus(%{
Expand Down Expand Up @@ -327,7 +329,8 @@ defmodule Dotcom.ScheduleFinder.UpcomingDepartures do
now: DateTime.t(),
predicted_schedule: PredictedSchedule.t(),
route_type: Route.route_type(),
status: nil | String.t()
status: nil | String.t(),
vehicle_at_stop_status: nil | Vehicles.Vehicle.status()
}) :: __MODULE__.UpcomingDeparture.arrival_status_t()
defp arrival_status(%{
predicted_schedule: %PredictedSchedule{prediction: nil},
Expand Down Expand Up @@ -376,7 +379,8 @@ defmodule Dotcom.ScheduleFinder.UpcomingDepartures do
defp arrival_status(%{
predicted_schedule: %PredictedSchedule{prediction: prediction},
route_type: route_type,
now: now
now: now,
vehicle_at_stop_status: vehicle_at_stop_status
})
when prediction != nil do
arrival_seconds = seconds_between(prediction.arrival_time, now)
Expand All @@ -385,7 +389,8 @@ defmodule Dotcom.ScheduleFinder.UpcomingDepartures do
realtime_arrival_status(%{
arrival_seconds: arrival_seconds,
departure_seconds: departure_seconds,
route_type: route_type
route_type: route_type,
vehicle_at_stop_status: vehicle_at_stop_status
})
end

Expand All @@ -407,41 +412,47 @@ defmodule Dotcom.ScheduleFinder.UpcomingDepartures do
@spec realtime_arrival_status(%{
arrival_seconds: integer(),
departure_seconds: integer(),
route_type: Route.route_type()
route_type: Route.route_type(),
vehicle_at_stop_status: nil | Vehicles.Vehicle.status()
}) :: __MODULE__.UpcomingDeparture.realtime_arrival_status_t()

defp realtime_arrival_status(%{
arrival_seconds: arrival_seconds,
departure_seconds: departure_seconds,
route_type: :subway
route_type: :bus
})
when (arrival_seconds <= 0 or arrival_seconds == nil) and departure_seconds <= 90,
do: :boarding
do: :now

defp realtime_arrival_status(%{arrival_seconds: seconds, route_type: :bus}) when seconds <= 30,
do: :now

# vehicle says it's at the stop
defp realtime_arrival_status(%{
arrival_seconds: arrival_seconds,
departure_seconds: departure_seconds,
route_type: :bus
route_type: :subway,
vehicle_at_stop_status: :stopped
})
when (arrival_seconds <= 0 or arrival_seconds == nil) and departure_seconds <= 90,
do: :now
when (arrival_seconds < 0 and departure_seconds >= 0) or departure_seconds <= 90,
do: :boarding

defp realtime_arrival_status(%{
arrival_seconds: nil,
departure_seconds: seconds
}),
do: {:departure_seconds, seconds}

defp realtime_arrival_status(%{arrival_seconds: seconds, route_type: :bus}) when seconds <= 30,
do: :now
arrival_seconds: arrival_seconds,
route_type: :subway,
vehicle_at_stop_status: status
})
when status != nil and arrival_seconds <= 30, do: :arriving

defp realtime_arrival_status(%{arrival_seconds: seconds, route_type: :subway})
when seconds <= 30,
do: :arriving
defp realtime_arrival_status(%{
arrival_seconds: arrival_seconds,
route_type: :subway,
vehicle_at_stop_status: status
})
when status != nil and arrival_seconds <= 60, do: :approaching

defp realtime_arrival_status(%{arrival_seconds: seconds, route_type: :subway})
when seconds <= 60,
do: :approaching
defp realtime_arrival_status(%{arrival_seconds: nil, departure_seconds: seconds}),
do: {:departure_seconds, seconds}

defp realtime_arrival_status(%{arrival_seconds: seconds}), do: {:arrival_seconds, seconds}

Expand Down
29 changes: 29 additions & 0 deletions lib/predicted_schedule.ex
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ defmodule PredictedSchedule do

@predictions_repo Application.compile_env!(:dotcom, :repo_modules)[:predictions]
@schedules_repo Application.compile_env!(:dotcom, :repo_modules)[:schedules]
@vehicles_repo Application.compile_env!(:dotcom, :repo_modules)[:vehicles]

def get(route_id, stop_id, opts \\ []) do
now = Keyword.get(opts, :now, Util.now())
Expand Down Expand Up @@ -278,6 +279,34 @@ defmodule PredictedSchedule do
def status(%PredictedSchedule{prediction: %Prediction{status: status}}), do: status
def status(_predicted_schedule), do: nil

@doc """
Retrieves predicted schedule vehicle
"""
@spec vehicle(PredictedSchedule.t()) :: Vehicles.Vehicle.t() | nil
def vehicle(%PredictedSchedule{prediction: %Prediction{vehicle_id: vehicle_id}})
when not is_nil(vehicle_id) do
@vehicles_repo.get(vehicle_id)
end

def vehicle(_), do: nil

@doc """
Retrieves status from predicted schedule vehicle if a vehicle is at or approaching the predicted schedule trip/stop/stop_sequence
"""
@spec vehicle_at_stop_status(PredictedSchedule.t()) :: Vehicles.Vehicle.status() | nil
def vehicle_at_stop_status(ps) do
stop = stop(ps)
stop_sequence = stop_sequence(ps)
vehicle = vehicle(ps)

if not is_nil(vehicle) and vehicle.stop_sequence == stop_sequence and
vehicle.stop_id in [stop.id | stop.child_ids] do
vehicle.status
end
end

def vehicle_status(_predicted_schedule), do: nil

@doc """
Determines if the given predicted schedule occurs after the given time
"""
Expand Down
1 change: 1 addition & 0 deletions lib/vehicles/parser.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ defmodule Vehicles.Parser do
stop_id: optional_id(relationships["stop"]),
direction_id: attributes["direction_id"],
status: status(attributes["current_status"]),
stop_sequence: attributes["current_stop_sequence"],
longitude: attributes["longitude"],
latitude: attributes["latitude"],
bearing: attributes["bearing"] || 0,
Expand Down
2 changes: 1 addition & 1 deletion lib/vehicles/supervisor.ex
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ defmodule Vehicles.Supervisor do
MBTA.Api.Stream.build_options(
name: Vehicles.Api.SSES,
path:
"/vehicles?fields[vehicle]=direction_id,current_status,longitude,latitude,bearing,occupancy_status"
"/vehicles?fields[vehicle]=direction_id,current_status,current_stop_sequence,longitude,latitude,bearing,occupancy_status"
)

[
Expand Down
2 changes: 2 additions & 0 deletions lib/vehicles/vehicle.ex
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ defmodule Vehicles.Vehicle do
:longitude,
:latitude,
:status,
:stop_sequence,
:bearing,
:crowding
]
Expand All @@ -28,6 +29,7 @@ defmodule Vehicles.Vehicle do
latitude: float,
bearing: non_neg_integer,
status: status,
stop_sequence: non_neg_integer,
crowding: crowding | nil
}
end
Loading