<?php |
<?php |
|
|
/* |
/* |
* Copyright 2010,2011 Alexander Sadleir |
* Copyright 2010,2011 Alexander Sadleir |
|
|
Licensed under the Apache License, Version 2.0 (the "License"); |
Licensed under the Apache License, Version 2.0 (the "License"); |
you may not use this file except in compliance with the License. |
you may not use this file except in compliance with the License. |
You may obtain a copy of the License at |
You may obtain a copy of the License at |
|
|
http://www.apache.org/licenses/LICENSE-2.0 |
http://www.apache.org/licenses/LICENSE-2.0 |
|
|
Unless required by applicable law or agreed to in writing, software |
Unless required by applicable law or agreed to in writing, software |
distributed under the License is distributed on an "AS IS" BASIS, |
distributed under the License is distributed on an "AS IS" BASIS, |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
See the License for the specific language governing permissions and |
See the License for the specific language governing permissions and |
limitations under the License. |
limitations under the License. |
*/ |
*/ |
$service_periods = Array( |
$service_periods = Array( |
'sunday', |
'sunday', |
'saturday', |
'saturday', |
'weekday' |
'weekday' |
); |
); |
function service_period_day ($spid) { |
|
$idParts = explode("-",$spid); |
|
return strtolower($idParts[2]); |
|
} |
|
function service_period($date = "") { |
function service_period($date = "") { |
|
|
if (isset($_REQUEST['service_period'])) |
if (isset($_REQUEST['service_period'])) { |
return $_REQUEST['service_period']; |
return $_REQUEST['service_period']; |
|
} |
|
|
$override = getServiceOverride($date); |
$override = getServiceOverride($date); |
if ($override['service_id']) { |
if (isset($override['service_id'])) { |
return service_period_day ($override['service_id']); |
return strtolower($override['service_id']); |
} |
} |
|
$date = ($date != "" ? $date : time()); |
switch (date('w', ($date != "" ? $date : time()))) { |
$dow = date('w', $date); |
|
|
|
switch ($dow) { |
case 0: |
case 0: |
return 'sunday'; |
return 'sunday'; |
case 6: |
case 6: |
return 'saturday'; |
return 'saturday'; |
default: |
default: |
return 'weekday'; |
return 'weekday'; |
} |
} |
} |
} |
function service_ids($service_period) { |
|
|
function service_ids($service_period, $date = "") { |
switch ($service_period) { |
switch ($service_period) { |
case 'sunday': |
case 'sunday': |
return Array("Sunday","Sunday"); |
return Array("Sunday", "Sunday"); |
case 'saturday': |
case 'saturday': |
return Array("Saturday","Saturday"); |
return Array("Saturday", "Saturday"); |
default: |
default: |
//return 'weekday'; |
$date = ($date != "" ? $date : time()); |
return Array("Weekday","Weekday"); |
// school holidays |
} |
$ymd = date('Ymd', $date); |
} |
$dow = date('w', $date); |
|
if (intval($ymd) < "20120203" && $dow != 0 && $dow != 6) { |
|
return Array("Weekday-SchoolVacation", "Weekday-SchoolVacation"); |
|
} else { |
|
return Array("Weekday", "Weekday"); |
|
} |
|
} |
|
} |
|
|
function valid_service_ids() { |
function valid_service_ids() { |
return array_merge(service_ids(""),service_ids('saturday'),service_ids('sunday')); |
return array_merge(service_ids(""), service_ids('saturday'), service_ids('sunday')); |
} |
} |
|
|
function midnight_seconds($time = "") { |
function midnight_seconds($time = "") { |
// from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html |
// from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html |
if ($time != "") { |
if ($time != "") { |
return (date("G", $time) * 3600) + (date("i", $time) * 60) + date("s", $time); |
return (date("G", $time) * 3600) + (date("i", $time) * 60) + date("s", $time); |
} |
} |
if (isset($_SESSION['time'])) { |
if (isset($_SESSION['time'])) { |
$time = strtotime($_SESSION['time']); |
$time = strtotime($_SESSION['time']); |
return (date("G", $time) * 3600) + (date("i", $time) * 60) + date("s", $time); |
return (date("G", $time) * 3600) + (date("i", $time) * 60) + date("s", $time); |
} |
} |
return (date("G") * 3600) + (date("i") * 60) + date("s"); |
return (date("G") * 3600) + (date("i") * 60) + date("s"); |
} |
} |
|
|
function midnight_seconds_to_time($seconds) { |
function midnight_seconds_to_time($seconds) { |
if ($seconds > 0) { |
if ($seconds > 0) { |
$midnight = mktime(0, 0, 0, date("n"), date("j"), date("Y")); |
$midnight = mktime(0, 0, 0, date("n"), date("j"), date("Y")); |
return date("h:ia", $midnight + $seconds); |
return date("h:ia", $midnight + $seconds); |
} else { |
} else { |
return ""; |
return ""; |
} |
} |
} |
} |
|
|
if ($GTFSREnabled) { |
if ($GTFSREnabled) { |
$serviceAlertCause = Array( |
$serviceAlertCause = Array( |
"UNKNOWN_CAUSE" => "Unknown cause", |
"UNKNOWN_CAUSE" => "Unknown cause", |
"OTHER_CAUSE" => "Other cause", |
"OTHER_CAUSE" => "Other cause", |
"TECHNICAL_PROBLEM" => "Technical problem", |
"TECHNICAL_PROBLEM" => "Technical problem", |
"STRIKE" => "Strike", |
"STRIKE" => "Strike", |
"DEMONSTRATION" => "Demonstration", |
"DEMONSTRATION" => "Demonstration", |
"ACCIDENT" => "Accident", |
"ACCIDENT" => "Accident", |
"HOLIDAY" => "Holiday", |
"HOLIDAY" => "Holiday", |
"WEATHER" => "Weather", |
"WEATHER" => "Weather", |
"MAINTENANCE" => "Maintenance", |
"MAINTENANCE" => "Maintenance", |
"CONSTRUCTION" => "Construction", |
"CONSTRUCTION" => "Construction", |
"POLICE_ACTIVITY" => "Police activity", |
"POLICE_ACTIVITY" => "Police activity", |
"MEDICAL_EMERGENCY" => "Medical emergency" |
"MEDICAL_EMERGENCY" => "Medical emergency" |
); |
); |
$serviceAlertEffect = Array( |
$serviceAlertEffect = Array( |
"NO_SERVICE" => "No service", |
"NO_SERVICE" => "No service", |
"REDUCED_SERVICE" => "Reduced service", |
"REDUCED_SERVICE" => "Reduced service", |
"SIGNIFICANT_DELAYS" => "Significant delays", |
"SIGNIFICANT_DELAYS" => "Significant delays", |
"DETOUR" => "Detour", |
"DETOUR" => "Detour", |
"ADDITIONAL_SERVICE" => "Additional service", |
"ADDITIONAL_SERVICE" => "Additional service", |
"MODIFIED_SERVICE" => "Modified service", |
"MODIFIED_SERVICE" => "Modified service", |
"OTHER_EFFECT" => "Other effect", |
"OTHER_EFFECT" => "Other effect", |
"UNKNOWN_EFFECT" => "Unknown effect", |
"UNKNOWN_EFFECT" => "Unknown effect", |
"STOP_MOVED" => "Stop moved"); |
"STOP_MOVED" => "Stop moved"); |
|
|
set_include_path(get_include_path() . PATH_SEPARATOR . ($basePath . "lib/Protobuf-PHP/library/DrSlump/")); |
set_include_path(get_include_path() . PATH_SEPARATOR . ($basePath . "lib/Protobuf-PHP/library/DrSlump/")); |
|
|
include_once("Protobuf.php"); |
include_once("Protobuf.php"); |
include_once("Protobuf/Message.php"); |
include_once("Protobuf/Message.php"); |
include_once("Protobuf/Registry.php"); |
include_once("Protobuf/Registry.php"); |
include_once("Protobuf/Descriptor.php"); |
include_once("Protobuf/Descriptor.php"); |
include_once("Protobuf/Field.php"); |
include_once("Protobuf/Field.php"); |
|
|
include_once($basePath . "lib/Protobuf-PHP/gtfs-realtime.php"); |
include_once($basePath . "lib/Protobuf-PHP/gtfs-realtime.php"); |
include_once("Protobuf/CodecInterface.php"); |
include_once("Protobuf/CodecInterface.php"); |
include_once("Protobuf/Codec/PhpArray.php"); |
include_once("Protobuf/Codec/PhpArray.php"); |
include_once("Protobuf/Codec/Binary.php"); |
include_once("Protobuf/Codec/Binary.php"); |
include_once("Protobuf/Codec/Binary/Writer.php"); |
include_once("Protobuf/Codec/Binary/Writer.php"); |
include_once("Protobuf/Codec/Json.php"); |
include_once("Protobuf/Codec/Json.php"); |
|
|
function getServiceAlerts($filter_class = "", $filter_id = "") { |
function getServiceAlerts($filter_class = "", $filter_id = "") { |
/* |
/* |
|
|
also need last modified epoch of client gtfs |
also need last modified epoch of client gtfs |
|
|
- add,remove,patch,inform (null) |
- add,remove,patch,inform (null) |
- stop |
- stop |
- trip |
- trip |
- network |
- network |
- classes (WHERE=) |
- classes (WHERE=) |
- route (short_name or route_id) |
- route (short_name or route_id) |
- street |
- street |
- stop |
- stop |
- trip |
- trip |
Currently support: |
Currently support: |
network inform |
network inform |
trip patch: stop remove |
trip patch: stop remove |
street inform: route inform, trip inform, stop inform |
street inform: route inform, trip inform, stop inform |
route patch: trip remove |
route patch: trip remove |
*/ |
*/ |
$fm = new transit_realtime\FeedMessage(); |
$fm = new transit_realtime\FeedMessage(); |
$fh = new transit_realtime\FeedHeader(); |
$fh = new transit_realtime\FeedHeader(); |
$fh->setGtfsRealtimeVersion(1); |
$fh->setGtfsRealtimeVersion(1); |
$fh->setTimestamp(time()); |
$fh->setTimestamp(time()); |
$fm->setHeader($fh); |
$fm->setHeader($fh); |
foreach (getCurrentAlerts() as $alert) { |
foreach (getCurrentAlerts() as $alert) { |
$fe = new transit_realtime\FeedEntity(); |
$fe = new transit_realtime\FeedEntity(); |
$fe->setId($alert['id']); |
$fe->setId($alert['id']); |
$fe->setIsDeleted(false); |
$fe->setIsDeleted(false); |
$alert = new transit_realtime\Alert(); |
$alert = new transit_realtime\Alert(); |
$tr = new transit_realtime\TimeRange(); |
$tr = new transit_realtime\TimeRange(); |
$tr->setStart($alert['start']); |
$tr->setStart($alert['start']); |
$tr->setEnd($alert['end']); |
$tr->setEnd($alert['end']); |
$alert->addActivePeriod($tr); |
$alert->addActivePeriod($tr); |
$informedEntities = getInformedAlerts($alert['id'], $_REQUEST['filter_class'], $_REQUEST['filter_id']); |
$informedEntities = getInformedAlerts($alert['id'], $_REQUEST['filter_class'], $_REQUEST['filter_id']); |
if (sizeof($informedEntities) > 0) { |
if (sizeof($informedEntities) > 0) { |
$informed = Array(); |
$informed = Array(); |
$es = new transit_realtime\EntitySelector(); |
$es = new transit_realtime\EntitySelector(); |
if ($informedEntity['informed_class'] == "agency") { |
if ($informedEntity['informed_class'] == "agency") { |
$es->setAgencyId($informedEntity['informed_id']); |
$es->setAgencyId($informedEntity['informed_id']); |
} |
} |
if ($informedEntity['informed_class'] == "stop") { |
if ($informedEntity['informed_class'] == "stop") { |
$es->setStopId($informedEntity['informed_id']); |
$es->setStopId($informedEntity['informed_id']); |
} |
} |
if ($informedEntity['informed_class'] == "route") { |
if ($informedEntity['informed_class'] == "route") { |
$es->setRouteId($informedEntity['informed_id']); |
$es->setRouteId($informedEntity['informed_id']); |
} |
} |
if ($informedEntity['informed_class'] == "trip") { |
if ($informedEntity['informed_class'] == "trip") { |
$td = new transit_realtime\TripDescriptor(); |
$td = new transit_realtime\TripDescriptor(); |
$td->setTripId($informedEntity['informed_id']); |
$td->setTripId($informedEntity['informed_id']); |
$es->setTrip($td); |
$es->setTrip($td); |
} |
} |
$alert->addInformedEntity($es); |
$alert->addInformedEntity($es); |
} |
} |
$alert->setCause(constant("transit_realtime\Alert\Cause::" . $alert['cause'])); |
$alert->setCause(constant("transit_realtime\Alert\Cause::" . $alert['cause'])); |
$alert->setEffect(constant("transit_realtime\Alert\Effect::" . $alert['effect'])); |
$alert->setEffect(constant("transit_realtime\Alert\Effect::" . $alert['effect'])); |
$tsUrl = new transit_realtime\TranslatedString(); |
$tsUrl = new transit_realtime\TranslatedString(); |
$tUrl = new transit_realtime\TranslatedString\Translation(); |
$tUrl = new transit_realtime\TranslatedString\Translation(); |
$tUrl->setText($alert['url']); |
$tUrl->setText($alert['url']); |
$tUrl->setLanguage("en"); |
$tUrl->setLanguage("en"); |
$tsUrl->addTranslation($tUrl); |
$tsUrl->addTranslation($tUrl); |
$alert->setUrl($tsUrl); |
$alert->setUrl($tsUrl); |
$tsHeaderText = new transit_realtime\TranslatedString(); |
$tsHeaderText = new transit_realtime\TranslatedString(); |
$tHeaderText = new transit_realtime\TranslatedString\Translation(); |
$tHeaderText = new transit_realtime\TranslatedString\Translation(); |
$tHeaderText->setText($alert['header']); |
$tHeaderText->setText($alert['header']); |
$tHeaderText->setLanguage("en"); |
$tHeaderText->setLanguage("en"); |
$tsHeaderText->addTranslation($tHeaderText); |
$tsHeaderText->addTranslation($tHeaderText); |
$alert->setHeaderText($tsHeaderText); |
$alert->setHeaderText($tsHeaderText); |
$tsDescriptionText = new transit_realtime\TranslatedString(); |
$tsDescriptionText = new transit_realtime\TranslatedString(); |
$tDescriptionText = new transit_realtime\TranslatedString\Translation(); |
$tDescriptionText = new transit_realtime\TranslatedString\Translation(); |
$tDescriptionText->setText($alert['description']); |
$tDescriptionText->setText($alert['description']); |
$tDescriptionText->setLanguage("en"); |
$tDescriptionText->setLanguage("en"); |
$tsDescriptionText->addTranslation($tDescriptionText); |
$tsDescriptionText->addTranslation($tDescriptionText); |
$alert->setDescriptionText($tsDescriptionText); |
$alert->setDescriptionText($tsDescriptionText); |
$fe->setAlert($alert); |
$fe->setAlert($alert); |
$fm->addEntity($fe); |
$fm->addEntity($fe); |
} |
} |
return $fm; |
return $fm; |
} |
} |
|
|
function getServiceAlertsAsArray($filter_class = "", $filter_id = "") { |
function getServiceAlertsAsArray($filter_class = "", $filter_id = "") { |
$codec = new DrSlump\Protobuf\Codec\PhpArray(); |
$codec = new DrSlump\Protobuf\Codec\PhpArray(); |
return $codec->encode(getServiceAlerts($filter_class, $filter_id)); |
return $codec->encode(getServiceAlerts($filter_class, $filter_id)); |
} |
} |
|
|
function getServiceAlertsAsBinary($filter_class = "", $filter_id = "") { |
function getServiceAlertsAsBinary($filter_class = "", $filter_id = "") { |
$codec = new DrSlump\Protobuf\Codec\Binary(); |
$codec = new DrSlump\Protobuf\Codec\Binary(); |
return $codec->encode(getServiceAlerts($filter_class, $filter_id)); |
return $codec->encode(getServiceAlerts($filter_class, $filter_id)); |
} |
} |
|
|
function getServiceAlertsAsJSON($filter_class = "", $filter_id = "") { |
function getServiceAlertsAsJSON($filter_class = "", $filter_id = "") { |
$codec = new DrSlump\Protobuf\Codec\Json(); |
$codec = new DrSlump\Protobuf\Codec\Json(); |
return $codec->encode(getServiceAlerts($filter_class, $filter_id)); |
return $codec->encode(getServiceAlerts($filter_class, $filter_id)); |
} |
} |
|
|
function getServiceAlertsByClass() { |
function getServiceAlertsByClass() { |
$return = Array(); |
$return = Array(); |
$alerts = getServiceAlertsAsArray("", ""); |
$alerts = getServiceAlertsAsArray("", ""); |
foreach ($alerts['entities'] as $entity) { |
foreach ($alerts['entities'] as $entity) { |
foreach ($entity['informed'] as $informed) { |
foreach ($entity['informed'] as $informed) { |
foreach ($informed as $key => $value) { |
foreach ($informed as $key => $value) { |
if (strpos("_id", $key) > 0) { |
if (strpos("_id", $key) > 0) { |
$parts = explode($key); |
$parts = explode($key); |
$class = $parts[0]; |
$class = $parts[0]; |
$id = $value; |
$id = $value; |
} |
} |
} |
} |
$return[$class][$id][] = $entity; |
$return[$class][$id][] = $entity; |
} |
} |
} |
} |
} |
} |
|
|
function getTripUpdates($filter_class = "", $filter_id = "") { |
function getTripUpdates($filter_class = "", $filter_id = "") { |
$fm = new transit_realtime\FeedMessage(); |
$fm = new transit_realtime\FeedMessage(); |
$fh = new transit_realtime\FeedHeader(); |
$fh = new transit_realtime\FeedHeader(); |
$fh->setGtfsRealtimeVersion(1); |
$fh->setGtfsRealtimeVersion(1); |
$fh->setTimestamp(time()); |
$fh->setTimestamp(time()); |
$fm->setHeader($fh); |
$fm->setHeader($fh); |
foreach (getCurrentAlerts() as $alert) { |
foreach (getCurrentAlerts() as $alert) { |
$informedEntities = getInformedAlerts($alert['id'], $_REQUEST['filter_class'], $_REQUEST['filter_id']); |
$informedEntities = getInformedAlerts($alert['id'], $_REQUEST['filter_class'], $_REQUEST['filter_id']); |
$stops = Array(); |
$stops = Array(); |
$routestrips = Array(); |
$routestrips = Array(); |
if (sizeof($informedEntities) > 0) { |
if (sizeof($informedEntities) > 0) { |
if ($informedEntity['informed_class'] == "stop" && $informed["x-action"] == "remove") { |
if ($informedEntity['informed_class'] == "stop" && $informed["x-action"] == "remove") { |
$stops[] = $informedEntity['informed_id']; |
$stops[] = $informedEntity['informed_id']; |
} |
} |
if (($informedEntity['informed_class'] == "route" || $informedEntity['informed_class'] == "trip") && $informed["x-action"] == "patch") { |
if (($informedEntity['informed_class'] == "route" || $informedEntity['informed_class'] == "trip") && $informed["x-action"] == "patch") { |
$routestrips[] = Array("id" => $informedEntity['informed_id'], |
$routestrips[] = Array("id" => $informedEntity['informed_id'], |
"type" => $informedEntity['informed_class']); |
"type" => $informedEntity['informed_class']); |
} |
} |
} |
} |
foreach ($routestrips as $routetrip) { |
foreach ($routestrips as $routetrip) { |
$fe = new transit_realtime\FeedEntity(); |
$fe = new transit_realtime\FeedEntity(); |
$fe->setId($alert['id'] . $routetrip['id']); |
$fe->setId($alert['id'] . $routetrip['id']); |
$fe->setIsDeleted(false); |
$fe->setIsDeleted(false); |
$tu = new transit_realtime\TripUpdate(); |
$tu = new transit_realtime\TripUpdate(); |
$td = new transit_realtime\TripDescriptor(); |
$td = new transit_realtime\TripDescriptor(); |
if ($routetrip['type'] == "route") { |
if ($routetrip['type'] == "route") { |
$td->setRouteId($routetrip['id']); |
$td->setRouteId($routetrip['id']); |
} else if ($routetrip['type'] == "trip") { |
} else if ($routetrip['type'] == "trip") { |
$td->setTripId($routetrip['id']); |
$td->setTripId($routetrip['id']); |
} |
} |
$tu->setTrip($td); |
$tu->setTrip($td); |
foreach ($stops as $stop) { |
foreach ($stops as $stop) { |
$stu = new transit_realtime\TripUpdate\StopTimeUpdate(); |
$stu = new transit_realtime\TripUpdate\StopTimeUpdate(); |
$stu->setStopId($stop); |
$stu->setStopId($stop); |
$stu->setScheduleRelationship(transit_realtime\TripUpdate\StopTimeUpdate\ScheduleRelationship::SKIPPED); |
$stu->setScheduleRelationship(transit_realtime\TripUpdate\StopTimeUpdate\ScheduleRelationship::SKIPPED); |
$tu->addStopTimeUpdate($stu); |
$tu->addStopTimeUpdate($stu); |
} |
} |
$fe->setTripUpdate($tu); |
$fe->setTripUpdate($tu); |
$fm->addEntity($fe); |
$fm->addEntity($fe); |
} |
} |
} |
} |
return $fm; |
return $fm; |
} |
} |
|
|
function getTripUpdatesAsArray($filter_class = "", $filter_id = "") { |
function getTripUpdatesAsArray($filter_class = "", $filter_id = "") { |
$codec = new DrSlump\Protobuf\Codec\PhpArray(); |
$codec = new DrSlump\Protobuf\Codec\PhpArray(); |
return $codec->encode(getTripUpdates($filter_class, $filter_id)); |
return $codec->encode(getTripUpdates($filter_class, $filter_id)); |
} |
} |
|
|
function getTripUpdatesAsBinary($filter_class = "", $filter_id = "") { |
function getTripUpdatesAsBinary($filter_class = "", $filter_id = "") { |
$codec = new DrSlump\Protobuf\Codec\Binary(); |
$codec = new DrSlump\Protobuf\Codec\Binary(); |
return $codec->encode(getTripUpdates($filter_class, $filter_id)); |
return $codec->encode(getTripUpdates($filter_class, $filter_id)); |
} |
} |
|
|
function getTripUpdatesAsJSON($filter_class = "", $filter_id = "") { |
function getTripUpdatesAsJSON($filter_class = "", $filter_id = "") { |
$codec = new DrSlump\Protobuf\Codec\Json(); |
$codec = new DrSlump\Protobuf\Codec\Json(); |
return $codec->encode(getTripUpdates($filter_class, $filter_id)); |
return $codec->encode(getTripUpdates($filter_class, $filter_id)); |
} |
} |
|
|
} |
} |
?> |
|
|
|