Merge new gtfs-realtime into existing servicealerts architecture
[busui.git] / include / common-transit.inc.php
blob:a/include/common-transit.inc.php -> blob:b/include/common-transit.inc.php
<?php <?php
$service_periods = Array( $service_periods = Array(
'sunday', 'sunday',
'saturday', 'saturday',
'weekday' 'weekday'
); );
   
function service_period($date = "") function service_period($date = "")
{ {
if (isset($_SESSION['service_period'])) return $_SESSION['service_period']; if (isset($_SESSION['service_period'])) return $_SESSION['service_period'];
$override = getServiceOverride($date); $override = getServiceOverride($date);
if ($override['service_id']){ if ($override['service_id']){
return $override['service_id']; return $override['service_id'];
} }
   
switch (date('w',($date != "" ? $date : time()))) { switch (date('w',($date != "" ? $date : time()))) {
case 0: case 0:
return 'sunday'; return 'sunday';
case 6: case 6:
return 'saturday'; return 'saturday';
default: default:
return 'weekday'; return 'weekday';
} }
} }
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) {
$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");
   
function getServiceAlerts($filter_class, $filter_id) { 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 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
*/ */
$return = Array(); $fm = new transit_realtime\FeedMessage();
$return['header']['gtfs_realtime_version'] = "1"; $fh = new transit_realtime\FeedHeader();
$return['header']['timestamp'] = time(); $fh->setGtfsRealtimeVersion(1);
$return['header']['incrementality'] = "FULL_DATASET"; $fh->setTimestamp(time());
$return['entities'] = Array(); $fm->setHeader($fh);
foreach(getCurrentAlerts() as $alert) { foreach(getCurrentAlerts() as $alert) {
$informedEntities = getInformedAlerts($alert['id'],$_REQUEST['filter_class'],$_REQUEST['filter_id']); $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) { if (sizeof($informedEntities) >0) {
$entity = Array(); $informed = Array();
$entity['id'] = $alert['id']; $es = new transit_realtime\EntitySelector();
$entity['alert']['active_period']['start'] = $alert['start']; if ($informedEntity['informed_class'] == "agency") {
$entity['alert']['active_period']['end'] = $alert['end']; $es->setAgencyId($informedEntity['informed_id']);
$entity['alert']['url']['translation']['text'] = $alert['url']; }
$entity['alert']['url']['translation']['language'] = 'en'; if ($informedEntity['informed_class'] == "stop") {
$entity['alert']['header_text']['translation']['text'] = $alert['header']; $es->setStopId($informedEntity['informed_id']);
$entity['alert']['header_text']['translation']['language'] = 'en'; }
$entity['alert']['description_text']['translation']['text'] = $alert['description']; if ($informedEntity['informed_class'] == "route") {
$entity['alert']['description_text']['translation']['language'] = 'en'; $es->setRouteId($informedEntity['informed_id']);
  }
foreach ($informedEntities as $informedEntity) { if ($informedEntity['informed_class'] == "trip") {
$informed = Array(); $td = new transit_realtime\TripDescriptor();
$informed[$informedEntity['informed_class']."_id"] = $informedEntity['informed_id']; $td->setTripId($informedEntity['informed_id']);
if ($informedEntity['informed_action'] != "") $informed["x-action"] = $informedEntity['informed_action']; $es->setTrip($td);
$informed[$informedEntity['class']."_type"] = $informedEntity['type']; }
$entity['informed'][] = $informed; $alert-> addInformedEntity($es);
} }
$return['entities'][] = $entity; $alert->setCause(constant("transit_realtime\Alert\Cause::".$alert['cause']));
} $alert->setEffect(constant("transit_realtime\Alert\Effect::".$alert['effect']));
} $tsUrl = new transit_realtime\TranslatedString();
return $return; $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() { function getServiceAlertsByClass() {
$return = Array(); $return = Array();
$alerts = getServiceAlerts("",""); $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'] = $entity; $return[$class][$id][] = $entity;
$return[$class][$id][]['action'] = $informed["x-action"]; }
} }
} }
   
  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));
  }
} }
?> ?>