Add test of protobuf GTFS-realtime conversion to PHP
Add test of protobuf GTFS-realtime conversion to 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 "";
} }
} }
   
$serviceAlertCause = Array( $serviceAlertCause = Array(
UNKNOWN_CAUSE "UNKNOWN_CAUSE" => "Unknown cause",
OTHER_CAUSE "OTHER_CAUSE" => "Other cause",
TECHNICAL_PROBLEM "TECHNICAL_PROBLEM" => "Technical problem",
STRIKE "STRIKE" => "Strike",
DEMONSTRATION "DEMONSTRATION" => "Demonstration",
ACCIDENT "ACCIDENT" => "Accident",
HOLIDAY "HOLIDAY" => "Holiday",
WEATHER "WEATHER" => "Weather",
MAINTENANCE "MAINTENANCE" => "Maintenance",
CONSTRUCTION "CONSTRUCTION" => "Construction",
POLICE_ACTIVITY "POLICE_ACTIVITY" => "Police activity",
MEDICAL_EMERGENCY "MEDICAL_EMERGENCY" => "Medical emergency"
   
Unknown cause  
Other cause (not represented by any of these options)  
Technical problem  
Strike  
Demonstration  
Accident  
Holiday  
Weather  
Maintenance  
Construction  
Police activity  
Medical emergency  
); );
$serviceAlertEffect = Array( $serviceAlertEffect = Array(
NO_SERVICE "NO_SERVICE" => "No service",
REDUCED_SERVICE "REDUCED_SERVICE" => "Reduced service",
SIGNIFICANT_DELAYS "SIGNIFICANT_DELAYS" => "Significant delays",
DETOUR "DETOUR" => "Detour",
ADDITIONAL_SERVICE "ADDITIONAL_SERVICE" => "Additional service",
MODIFIED_SERVICE "MODIFIED_SERVICE" => "Modified service",
OTHER_EFFECT "OTHER_EFFECT" => "Other effect",
UNKNOWN_EFFECT "UNKNOWN_EFFECT" => "Unknown effect",
STOP_MOVED "STOP_MOVED" => "Stop moved");
   
No service  
Reduced service  
Significant delays (insignificant delays should only be provided through Trip updates).  
Detour  
Additional service  
Modified service  
Stop moved  
Other effect (not represented by any of these options)  
Unknown effect);  
   
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
*/ */
$return = Array(); $return = Array();
$return['header']['gtfs_realtime_version'] = "1"; $return['header']['gtfs_realtime_version'] = "1";
$return['header']['timestamp'] = time(); $return['header']['timestamp'] = time();
$return['header']['incrementality'] = "FULL_DATASET"; $return['header']['incrementality'] = "FULL_DATASET";
$return['entities'] = Array(); $return['entities'] = Array();
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']);
if (sizeof($informedEntities) >0) { if (sizeof($informedEntities) >0) {
$entity = Array(); $entity = Array();
$entity['id'] = $alert['id']; $entity['id'] = $alert['id'];
$entity['alert']['active_period']['start'] = $alert['start']; $entity['alert']['active_period']['start'] = $alert['start'];
$entity['alert']['active_period']['end'] = $alert['end']; $entity['alert']['active_period']['end'] = $alert['end'];
$entity['alert']['url']['translation']['text'] = $alert['url']; $entity['alert']['url']['translation']['text'] = $alert['url'];
$entity['alert']['url']['translation']['language'] = 'en'; $entity['alert']['url']['translation']['language'] = 'en';
$entity['alert']['header_text']['translation']['text'] = $alert['header']; $entity['alert']['header_text']['translation']['text'] = $alert['header'];
$entity['alert']['header_text']['translation']['language'] = 'en'; $entity['alert']['header_text']['translation']['language'] = 'en';
$entity['alert']['description_text']['translation']['text'] = $alert['description']; $entity['alert']['description_text']['translation']['text'] = $alert['description'];
$entity['alert']['description_text']['translation']['language'] = 'en'; $entity['alert']['description_text']['translation']['language'] = 'en';
foreach ($informedEntities as $informedEntity) { foreach ($informedEntities as $informedEntity) {
$informed = Array(); $informed = Array();
$informed[$informedEntity['informed_class']."_id"] = $informedEntity['informed_id']; $informed[$informedEntity['informed_class']."_id"] = $informedEntity['informed_id'];
if ($informedEntity['informed_action'] != "") $informed["x-action"] = $informedEntity['informed_action']; if ($informedEntity['informed_action'] != "") $informed["x-action"] = $informedEntity['informed_action'];
$informed[$informedEntity['class']."_type"] = $informedEntity['type']; $informed[$informedEntity['class']."_type"] = $informedEntity['type'];
$entity['informed'][] = $informed; $entity['informed'][] = $informed;
} }
$return['entities'][] = $entity; $return['entities'][] = $entity;
} }
} }
return $return; return $return;
} }
function getServiceAlertsByClass() { function getServiceAlertsByClass() {
$return = Array(); $return = Array();
$alerts = getServiceAlerts("",""); $alerts = getServiceAlerts("","");
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'] = $entity;
$return[$class][$id][]['action'] = $informed["x-action"]; $return[$class][$id][]['action'] = $informed["x-action"];
} }
} }
} }
?> ?>
   
  <?php
  include_once("library/DrSlump/Protobuf.php");
  include_once("library/DrSlump/Protobuf/Message.php");
  include_once("library/DrSlump/Protobuf/Registry.php");
  include_once("library/DrSlump/Protobuf/Descriptor.php");
  include_once("library/DrSlump/Protobuf/Field.php");
 
  include_once("gtfs-realtime.php");
  include_once("library/DrSlump/Protobuf/CodecInterface.php");
  include_once("library/DrSlump/Protobuf/Codec/PhpArray.php");
  include_once("library/DrSlump/Protobuf/Codec/Binary.php");
  include_once("library/DrSlump/Protobuf/Codec/Binary/Writer.php");
  include_once("library/DrSlump/Protobuf/Codec/Json.php");
  //print_r(get_declared_classes());
  $fm = new transit_realtime\FeedMessage();
  $fh = new transit_realtime\FeedHeader();
  $fh->setGtfsRealtimeVersion(1);
  $fh->setTimestamp(time());
  $fm->setHeader($fh);
  $fe = new transit_realtime\FeedEntity();
  $fe->setId("1234");
  $alert = new transit_realtime\Alert();
  $tr = new transit_realtime\TimeRange();
  $tr->setStart(000);
  $tr->setEnd(001);
  $alert-> addActivePeriod($tr);
  $es = new transit_realtime\EntitySelector();
  $es->setAgencyId("0");
  $es->setStopId("0");
  $es->setRouteId("0");
  $td = new transit_realtime\TripDescriptor();
  $td->setTripId("0");
  $es->setTrip($td);
  $alert-> addInformedEntity($es);
  $alert->setCause(constant("transit_realtime\Alert\Cause::"."UNKNOWN_CAUSE"));
  $alert->setEffect(constant("transit_realtime\Alert\Effect::"."UNKNOWN_EFFECT"));
  $tsUrl = new transit_realtime\TranslatedString();
  $tUrl = new transit_realtime\TranslatedString\Translation();
  $tUrl->setText("http");
  $tUrl->setLanguage("en");
  $tsUrl->addTranslation($tUrl);
  $alert->setUrl($tsUrl);
  $tsHeaderText= new transit_realtime\TranslatedString();
  $tHeaderText = new transit_realtime\TranslatedString\Translation();
  $tHeaderText->setText("http");
  $tHeaderText->setLanguage("en");
  $tsHeaderText->addTranslation($tHeaderText);
  $alert->setHeaderText($tsHeaderText);
  $tsDescriptionText= new transit_realtime\TranslatedString();
  $tDescriptionText = new transit_realtime\TranslatedString\Translation();
  $tDescriptionText->setText("http");
  $tDescriptionText->setLanguage("en");
  $tsDescriptionText->addTranslation($tDescriptionText);
  $alert->setDescriptionText($tsDescriptionText);
  $fe->setAlert($alert);
  $fm->addEntity($fe);
  //var_dump($fm);
 
  //$codec = new DrSlump\Protobuf\Codec\Binary();
  //echo $codec->encode($fm);
 
  $codec = new DrSlump\Protobuf\Codec\Json();
  echo $codec->encode($fm);
 
  ?>