--- a/include/common-transit.inc.php +++ b/include/common-transit.inc.php @@ -1,260 +1,290 @@ 0) { - $midnight = mktime(0, 0, 0, date("n") , date("j") , date("Y")); - return date("h:ia", $midnight + $seconds); - } - else { - return ""; - } -} +function service_period($date = "") { + + if (isset($_SESSION['service_period'])) + return $_SESSION['service_period']; + $override = getServiceOverride($date); + if ($override['service_id']) { + $idParts = explode("-",$override['service_id']); + return strtolower($idParts[2]); + } + + switch (date('w', ($date != "" ? $date : time()))) { + case 0: + return 'sunday'; + case 6: + return 'saturday'; + default: + return 'weekday'; + } +} +function service_ids($service_period) { + switch ($service_period) { + case 'sunday': + return Array("2010-TUGGSUN-Sunday-20","2010-BELCSUN-Sunday-19"); + case 'saturday': + return Array("2010-BELCSAT-Saturday-19","2010-TUGGSAT-Saturday-19"); + default: + //return 'weekday'; + return Array("2010-BELCMAST-Weekday-15","2010-TUGGMAST-Weekday-14"); + } +} + +function midnight_seconds($time = "") { + // from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html + if ($time != "") { + return (date("G", $time) * 3600) + (date("i", $time) * 60) + date("s", $time); + } + if (isset($_SESSION['time'])) { + $time = strtotime($_SESSION['time']); + return (date("G", $time) * 3600) + (date("i", $time) * 60) + date("s", $time); + } + return (date("G") * 3600) + (date("i") * 60) + date("s"); +} + +function midnight_seconds_to_time($seconds) { + if ($seconds > 0) { + $midnight = mktime(0, 0, 0, date("n"), date("j"), date("Y")); + return date("h:ia", $midnight + $seconds); + } else { + return ""; + } +} + if ($GTFSREnabled) { -$serviceAlertCause = Array( -"UNKNOWN_CAUSE" => "Unknown cause", -"OTHER_CAUSE" => "Other cause", -"TECHNICAL_PROBLEM" => "Technical problem", -"STRIKE" => "Strike", -"DEMONSTRATION" => "Demonstration", -"ACCIDENT" => "Accident", -"HOLIDAY" => "Holiday", -"WEATHER" => "Weather", -"MAINTENANCE" => "Maintenance", -"CONSTRUCTION" => "Construction", -"POLICE_ACTIVITY" => "Police activity", -"MEDICAL_EMERGENCY" => "Medical emergency" -); -$serviceAlertEffect = Array( -"NO_SERVICE" => "No service", -"REDUCED_SERVICE" => "Reduced service", -"SIGNIFICANT_DELAYS" => "Significant delays", -"DETOUR" => "Detour", -"ADDITIONAL_SERVICE" => "Additional service", -"MODIFIED_SERVICE" => "Modified service", -"OTHER_EFFECT" => "Other effect", -"UNKNOWN_EFFECT" => "Unknown effect", -"STOP_MOVED" => "Stop moved"); - -set_include_path(get_include_path() . PATH_SEPARATOR . $labsPath."lib/Protobuf-PHP/library/DrSlump/"); - -include_once("Protobuf.php"); -include_once("Protobuf/Message.php"); -include_once("Protobuf/Registry.php"); -include_once("Protobuf/Descriptor.php"); -include_once("Protobuf/Field.php"); - -include_once($labsPath."lib/Protobuf-PHP/gtfs-realtime.php"); -include_once("Protobuf/CodecInterface.php"); -include_once("Protobuf/Codec/PhpArray.php"); -include_once("Protobuf/Codec/Binary.php"); -include_once("Protobuf/Codec/Binary/Writer.php"); -include_once("Protobuf/Codec/Json.php"); - -function getServiceAlerts($filter_class = "", $filter_id = "") { -/* - - also need last modified epoch of client gtfs - - - add,remove,patch,inform (null) - - stop - - trip - - network + $serviceAlertCause = Array( + "UNKNOWN_CAUSE" => "Unknown cause", + "OTHER_CAUSE" => "Other cause", + "TECHNICAL_PROBLEM" => "Technical problem", + "STRIKE" => "Strike", + "DEMONSTRATION" => "Demonstration", + "ACCIDENT" => "Accident", + "HOLIDAY" => "Holiday", + "WEATHER" => "Weather", + "MAINTENANCE" => "Maintenance", + "CONSTRUCTION" => "Construction", + "POLICE_ACTIVITY" => "Police activity", + "MEDICAL_EMERGENCY" => "Medical emergency" + ); + $serviceAlertEffect = Array( + "NO_SERVICE" => "No service", + "REDUCED_SERVICE" => "Reduced service", + "SIGNIFICANT_DELAYS" => "Significant delays", + "DETOUR" => "Detour", + "ADDITIONAL_SERVICE" => "Additional service", + "MODIFIED_SERVICE" => "Modified service", + "OTHER_EFFECT" => "Other effect", + "UNKNOWN_EFFECT" => "Unknown effect", + "STOP_MOVED" => "Stop moved"); + + set_include_path(get_include_path() . PATH_SEPARATOR . ($basePath . "lib/Protobuf-PHP/library/DrSlump/")); + + include_once("Protobuf.php"); + include_once("Protobuf/Message.php"); + include_once("Protobuf/Registry.php"); + include_once("Protobuf/Descriptor.php"); + include_once("Protobuf/Field.php"); + + include_once($basePath . "lib/Protobuf-PHP/gtfs-realtime.php"); + include_once("Protobuf/CodecInterface.php"); + include_once("Protobuf/Codec/PhpArray.php"); + include_once("Protobuf/Codec/Binary.php"); + include_once("Protobuf/Codec/Binary/Writer.php"); + include_once("Protobuf/Codec/Json.php"); + + function getServiceAlerts($filter_class = "", $filter_id = "") { + /* + + also need last modified epoch of client gtfs + + - add,remove,patch,inform (null) + - stop + - trip + - network - classes (WHERE=) - - route (short_name or route_id) - - street - - stop - - trip - Currently support: - network inform - trip patch: stop remove - street inform: route inform, trip inform, stop inform - route patch: trip remove - */ - $fm = new transit_realtime\FeedMessage(); -$fh = new transit_realtime\FeedHeader(); -$fh->setGtfsRealtimeVersion(1); -$fh->setTimestamp(time()); -$fm->setHeader($fh); -foreach(getCurrentAlerts() as $alert) { -$fe = new transit_realtime\FeedEntity(); - $fe->setId($alert['id']); - $fe->setIsDeleted(false); - $alert = new transit_realtime\Alert(); - $tr = new transit_realtime\TimeRange(); - $tr->setStart($alert['start']); - $tr->setEnd($alert['end']); - $alert-> addActivePeriod($tr); - $informedEntities = getInformedAlerts($alert['id'],$_REQUEST['filter_class'],$_REQUEST['filter_id']); - if (sizeof($informedEntities) >0) { - $informed = Array(); - $es = new transit_realtime\EntitySelector(); - if ($informedEntity['informed_class'] == "agency") { - $es->setAgencyId($informedEntity['informed_id']); - } - if ($informedEntity['informed_class'] == "stop") { - $es->setStopId($informedEntity['informed_id']); - } - if ($informedEntity['informed_class'] == "route") { - $es->setRouteId($informedEntity['informed_id']); - } - if ($informedEntity['informed_class'] == "trip") { - $td = new transit_realtime\TripDescriptor(); - $td->setTripId($informedEntity['informed_id']); - $es->setTrip($td); - } - $alert-> addInformedEntity($es); - } - $alert->setCause(constant("transit_realtime\Alert\Cause::".$alert['cause'])); - $alert->setEffect(constant("transit_realtime\Alert\Effect::".$alert['effect'])); - $tsUrl = new transit_realtime\TranslatedString(); - $tUrl = new transit_realtime\TranslatedString\Translation(); - $tUrl->setText($alert['url']); - $tUrl->setLanguage("en"); - $tsUrl->addTranslation($tUrl); - $alert->setUrl($tsUrl); - $tsHeaderText= new transit_realtime\TranslatedString(); - $tHeaderText = new transit_realtime\TranslatedString\Translation(); - $tHeaderText->setText($alert['header']); - $tHeaderText->setLanguage("en"); - $tsHeaderText->addTranslation($tHeaderText); - $alert->setHeaderText($tsHeaderText); - $tsDescriptionText= new transit_realtime\TranslatedString(); - $tDescriptionText = new transit_realtime\TranslatedString\Translation(); - $tDescriptionText->setText($alert['description']); - $tDescriptionText->setLanguage("en"); - $tsDescriptionText->addTranslation($tDescriptionText); - $alert->setDescriptionText($tsDescriptionText); - $fe->setAlert($alert); -$fm->addEntity($fe); -} -return $fm; -} -function getServiceAlertsAsArray($filter_class = "", $filter_id = "") { - $codec = new DrSlump\Protobuf\Codec\PhpArray(); - return $codec->encode(getServiceAlerts($filter_class, $filter_id)); -} - -function getServiceAlertsAsBinary($filter_class = "", $filter_id = "") { - $codec = new DrSlump\Protobuf\Codec\Binary(); - return $codec->encode(getServiceAlerts($filter_class, $filter_id)); -} - -function getServiceAlertsAsJSON($filter_class = "", $filter_id = "") { - $codec = new DrSlump\Protobuf\Codec\Json(); - return $codec->encode(getServiceAlerts($filter_class, $filter_id)); -} -function getServiceAlertsByClass() { - $return = Array(); - $alerts = getServiceAlertsAsArray("",""); - foreach ($alerts['entities'] as $entity) { - foreach ($entity['informed'] as $informed) { - foreach($informed as $key => $value){ - if (strpos("_id",$key) > 0) { - $parts = explode($key); - $class = $parts[0]; - $id = $value; - } - } - $return[$class][$id][] = $entity; - } - } -} - -function getTripUpdates($filter_class = "", $filter_id = "") { - $fm = new transit_realtime\FeedMessage(); -$fh = new transit_realtime\FeedHeader(); -$fh->setGtfsRealtimeVersion(1); -$fh->setTimestamp(time()); -$fm->setHeader($fh); -foreach(getCurrentAlerts() as $alert) { - $informedEntities = getInformedAlerts($alert['id'],$_REQUEST['filter_class'],$_REQUEST['filter_id']); - $stops = Array(); - $routestrips = Array(); - if (sizeof($informedEntities) >0) { - if ($informedEntity['informed_class'] == "stop" && $informed["x-action"] == "remove") { - $stops[] = $informedEntity['informed_id']; - } - if (($informedEntity['informed_class'] == "route" || $informedEntity['informed_class'] == "trip") && $informed["x-action"] == "patch" ) { - $routestrips[] = Array( "id" => $informedEntity['informed_id'], - "type"=>$informedEntity['informed_class']); - } - } -foreach ($routestrips as $routetrip) { -$fe = new transit_realtime\FeedEntity(); - $fe->setId($alert['id'].$routetrip['id']); - $fe->setIsDeleted(false); - $tu = new transit_realtime\TripUpdate(); - $td = new transit_realtime\TripDescriptor(); - if ($routetrip['type'] == "route") { - $td->setRouteId($routetrip['id']); - } else if ($routetrip['type'] == "trip") { - $td->setTripId($routetrip['id']); - } - $tu->setTrip($td); - foreach ($stops as $stop) { - $stu = new transit_realtime\TripUpdate\StopTimeUpdate(); - $stu->setStopId($stop); - $stu->setScheduleRelationship(transit_realtime\TripUpdate\StopTimeUpdate\ScheduleRelationship::SKIPPED); - $tu->addStopTimeUpdate($stu); - } - $fe->setTripUpdate($tu); -$fm->addEntity($fe); -} - -} -return $fm; - -} -function getTripUpdatesAsArray($filter_class = "", $filter_id = "") { - $codec = new DrSlump\Protobuf\Codec\PhpArray(); - return $codec->encode(getTripUpdates($filter_class, $filter_id)); -} - -function getTripUpdatesAsBinary($filter_class = "", $filter_id = "") { - $codec = new DrSlump\Protobuf\Codec\Binary(); - return $codec->encode(getTripUpdates($filter_class, $filter_id)); -} - -function getTripUpdatesAsJSON($filter_class = "", $filter_id = "") { - $codec = new DrSlump\Protobuf\Codec\Json(); - return $codec->encode(getTripUpdates($filter_class, $filter_id)); -} + - route (short_name or route_id) + - street + - stop + - trip + Currently support: + network inform + trip patch: stop remove + street inform: route inform, trip inform, stop inform + route patch: trip remove + */ + $fm = new transit_realtime\FeedMessage(); + $fh = new transit_realtime\FeedHeader(); + $fh->setGtfsRealtimeVersion(1); + $fh->setTimestamp(time()); + $fm->setHeader($fh); + foreach (getCurrentAlerts() as $alert) { + $fe = new transit_realtime\FeedEntity(); + $fe->setId($alert['id']); + $fe->setIsDeleted(false); + $alert = new transit_realtime\Alert(); + $tr = new transit_realtime\TimeRange(); + $tr->setStart($alert['start']); + $tr->setEnd($alert['end']); + $alert->addActivePeriod($tr); + $informedEntities = getInformedAlerts($alert['id'], $_REQUEST['filter_class'], $_REQUEST['filter_id']); + if (sizeof($informedEntities) > 0) { + $informed = Array(); + $es = new transit_realtime\EntitySelector(); + if ($informedEntity['informed_class'] == "agency") { + $es->setAgencyId($informedEntity['informed_id']); + } + if ($informedEntity['informed_class'] == "stop") { + $es->setStopId($informedEntity['informed_id']); + } + if ($informedEntity['informed_class'] == "route") { + $es->setRouteId($informedEntity['informed_id']); + } + if ($informedEntity['informed_class'] == "trip") { + $td = new transit_realtime\TripDescriptor(); + $td->setTripId($informedEntity['informed_id']); + $es->setTrip($td); + } + $alert->addInformedEntity($es); + } + $alert->setCause(constant("transit_realtime\Alert\Cause::" . $alert['cause'])); + $alert->setEffect(constant("transit_realtime\Alert\Effect::" . $alert['effect'])); + $tsUrl = new transit_realtime\TranslatedString(); + $tUrl = new transit_realtime\TranslatedString\Translation(); + $tUrl->setText($alert['url']); + $tUrl->setLanguage("en"); + $tsUrl->addTranslation($tUrl); + $alert->setUrl($tsUrl); + $tsHeaderText = new transit_realtime\TranslatedString(); + $tHeaderText = new transit_realtime\TranslatedString\Translation(); + $tHeaderText->setText($alert['header']); + $tHeaderText->setLanguage("en"); + $tsHeaderText->addTranslation($tHeaderText); + $alert->setHeaderText($tsHeaderText); + $tsDescriptionText = new transit_realtime\TranslatedString(); + $tDescriptionText = new transit_realtime\TranslatedString\Translation(); + $tDescriptionText->setText($alert['description']); + $tDescriptionText->setLanguage("en"); + $tsDescriptionText->addTranslation($tDescriptionText); + $alert->setDescriptionText($tsDescriptionText); + $fe->setAlert($alert); + $fm->addEntity($fe); + } + return $fm; + } + + function getServiceAlertsAsArray($filter_class = "", $filter_id = "") { + $codec = new DrSlump\Protobuf\Codec\PhpArray(); + return $codec->encode(getServiceAlerts($filter_class, $filter_id)); + } + + function getServiceAlertsAsBinary($filter_class = "", $filter_id = "") { + $codec = new DrSlump\Protobuf\Codec\Binary(); + return $codec->encode(getServiceAlerts($filter_class, $filter_id)); + } + + function getServiceAlertsAsJSON($filter_class = "", $filter_id = "") { + $codec = new DrSlump\Protobuf\Codec\Json(); + return $codec->encode(getServiceAlerts($filter_class, $filter_id)); + } + + function getServiceAlertsByClass() { + $return = Array(); + $alerts = getServiceAlertsAsArray("", ""); + foreach ($alerts['entities'] as $entity) { + foreach ($entity['informed'] as $informed) { + foreach ($informed as $key => $value) { + if (strpos("_id", $key) > 0) { + $parts = explode($key); + $class = $parts[0]; + $id = $value; + } + } + $return[$class][$id][] = $entity; + } + } + } + + function getTripUpdates($filter_class = "", $filter_id = "") { + $fm = new transit_realtime\FeedMessage(); + $fh = new transit_realtime\FeedHeader(); + $fh->setGtfsRealtimeVersion(1); + $fh->setTimestamp(time()); + $fm->setHeader($fh); + foreach (getCurrentAlerts() as $alert) { + $informedEntities = getInformedAlerts($alert['id'], $_REQUEST['filter_class'], $_REQUEST['filter_id']); + $stops = Array(); + $routestrips = Array(); + if (sizeof($informedEntities) > 0) { + if ($informedEntity['informed_class'] == "stop" && $informed["x-action"] == "remove") { + $stops[] = $informedEntity['informed_id']; + } + if (($informedEntity['informed_class'] == "route" || $informedEntity['informed_class'] == "trip") && $informed["x-action"] == "patch") { + $routestrips[] = Array("id" => $informedEntity['informed_id'], + "type" => $informedEntity['informed_class']); + } + } + foreach ($routestrips as $routetrip) { + $fe = new transit_realtime\FeedEntity(); + $fe->setId($alert['id'] . $routetrip['id']); + $fe->setIsDeleted(false); + $tu = new transit_realtime\TripUpdate(); + $td = new transit_realtime\TripDescriptor(); + if ($routetrip['type'] == "route") { + $td->setRouteId($routetrip['id']); + } else if ($routetrip['type'] == "trip") { + $td->setTripId($routetrip['id']); + } + $tu->setTrip($td); + foreach ($stops as $stop) { + $stu = new transit_realtime\TripUpdate\StopTimeUpdate(); + $stu->setStopId($stop); + $stu->setScheduleRelationship(transit_realtime\TripUpdate\StopTimeUpdate\ScheduleRelationship::SKIPPED); + $tu->addStopTimeUpdate($stu); + } + $fe->setTripUpdate($tu); + $fm->addEntity($fe); + } + } + return $fm; + } + + function getTripUpdatesAsArray($filter_class = "", $filter_id = "") { + $codec = new DrSlump\Protobuf\Codec\PhpArray(); + return $codec->encode(getTripUpdates($filter_class, $filter_id)); + } + + function getTripUpdatesAsBinary($filter_class = "", $filter_id = "") { + $codec = new DrSlump\Protobuf\Codec\Binary(); + return $codec->encode(getTripUpdates($filter_class, $filter_id)); + } + + function getTripUpdatesAsJSON($filter_class = "", $filter_id = "") { + $codec = new DrSlump\Protobuf\Codec\Json(); + return $codec->encode(getTripUpdates($filter_class, $filter_id)); + } + } ?>