19 Commits

Author SHA1 Message Date
06e6bceb59 Final Draft of 16schedule.json
All checks were successful
Generate and Release Protos / release (push) Successful in 36s
2026-02-25 16:21:40 +00:00
315be1af57 Lost in schema translation! 2026-02-24 21:23:16 +00:00
c9f328bb58 Ensure that data_kind it not optinal
All checks were successful
Generate and Release Protos / release (push) Successful in 30s
2026-02-24 11:56:53 +00:00
355494fc97 Add payload key to MessageEnvelope
All checks were successful
Generate and Release Protos / release (push) Successful in 30s
2026-02-24 11:50:00 +00:00
76281bacfb Wrap schedule message into envelope
All checks were successful
Generate and Release Protos / release (push) Successful in 33s
2026-02-24 11:36:51 +00:00
aff523a038 Add bool for 'pass'
All checks were successful
Generate and Release Protos / release (push) Successful in 30s
2026-02-23 20:42:52 +00:00
e0a7c5f56e Add boolean for passesAnotherTrain
All checks were successful
Generate and Release Protos / release (push) Successful in 32s
2026-02-23 20:30:05 +00:00
9a9fc59e22 Add booleans to describe service activities and whether the service is supressed 2026-02-23 20:29:10 +00:00
d103314350 Rename problematic files
All checks were successful
Generate and Release Protos / release (push) Successful in 29s
2026-02-23 19:20:29 +00:00
5c16b17aea Try passing '$id' as ref
Some checks failed
Generate and Release Protos / release (push) Failing after 23s
2026-02-23 19:17:39 +00:00
71e04b93d5 Try relpath from repo root!
Some checks failed
Generate and Release Protos / release (push) Failing after 26s
2026-02-23 19:14:54 +00:00
423bb9fc34 Try path from repo root
Some checks failed
Generate and Release Protos / release (push) Failing after 25s
2026-02-23 19:13:33 +00:00
eb7c3a18d8 Try rel path
Some checks failed
Generate and Release Protos / release (push) Failing after 23s
2026-02-23 19:11:53 +00:00
fe68c038de Fix ref to schema file
Some checks failed
Generate and Release Protos / release (push) Failing after 23s
2026-02-23 19:09:37 +00:00
776263c068 Add Schedule type for Darwin PushPort
Some checks failed
Generate and Release Protos / release (push) Failing after 25s
2026-02-23 19:07:31 +00:00
87ed1d01d5 Add late & canel reason keys 2026-02-22 01:48:26 +00:00
057f5ed777 Add 'atRemoved' field to TSTime definition 2026-02-22 01:32:03 +00:00
93df742c7d Add schemas for PushPort TS Message type 2026-02-22 01:29:50 +00:00
f20f2f83ec Update readme to exlpain installing the package with Go. 2026-01-14 19:16:51 +00:00
8 changed files with 618 additions and 203 deletions

View File

@@ -20,7 +20,21 @@ Since the package is hosted in the Gitea Package Registry, you must configure yo
**Setup:** **Setup:**
```bash ```bash
export GOPROXY=[https://git.fjla.uk/api/packages/owlboard/go,https://proxy.golang.org,direct](https://git.fjla.uk/api/packages/owlboard/go,https://proxy.golang.org,direct) # Set the proxy to check our Gitea instance first
go env -w GOPROXY="https://git.fjla.uk/api/packages/OwlBoard/go,https://proxy.golang.org,direct"
# Trust our internal domain and skip the public Google checksum database
go env -w GONOSUMDB="git.fjla.uk"
```
The, you can simply run go get, as usual.
#### Container Usage
```bash
ARG GOPROXY=https://git.fjla.uk/api/packages/OwlBoard/go,https://proxy.golang.org,direct
ARG GONOSUMDB=git.fjla.uk
ENV GOPROXY=$GOPROXY
ENV GONOSUMDB=$GONOSUMDB
``` ```
### 2. Typescript Services ### 2. Typescript Services

View File

@@ -1,198 +0,0 @@
syntax = "proto3";
package rail_backend.v1;
enum SchedulePayloadType {
VSTP_MESSAGE_TYPE_UNSPECIFIED = 0;
Create = 1;
Delete = 2;
}
message RunsOnDays {
bool sunday = 1;
bool monday = 2;
bool tuesday = 3;
bool wednesday = 4;
bool thursday = 5;
bool friday = 6;
bool saturday = 7;
bool bank_holidays = 8;
}
enum TrainStatus {
TRAIN_STATUS_UNSPECIFIED = 0;
PERMANENT_BUS = 1;
PERMANENT_FREIGHT = 2;
PERMANENT_PASSENGER_OR_PARCELS = 3;
PERMANENT_SHIP = 4;
PERMANENT_TRIP = 5;
STP_PASSENGER_ORPARCELS = 6;
STP_FREIGHT = 7;
STP_TRIP = 8;
STP_SHIP = 9;
STP_BUS = 10;
}
enum TrainCategory {
TRAIN_CATEGORY_UNSPECIFIED = 0;
METRO_SERVICE = 1;
UNADVERTISED_PASSENGER_TRAIN = 2;
ORDINARY_PASSENGER_TRAIN = 3;
STAFF_TRAIN = 4;
MIXED_TRAIN = 5;
CHANNEL_TUNNEL_TRAIN = 6;
EUROPEAN_SLEEPER_TRAIN = 7;
INTERNATIONAL_PASSENGER_TRAIN = 8;
MOTORAIL_SERVICE = 9;
UNADVERTISED_EXPRESS_TRAIN = 10;
EXPRESS_PASSENGER_TRAIN = 11;
SLEEPER_SERVICE = 12;
REPLACEMENT_BUS_SERVICE = 13;
BUS_SERVICE = 14;
SHIP = 15;
EMPTY_COACHING_STOCK = 16;
EMPTY_METRO_SERVICE = 17;
METRO_STAFF_SERVICE = 18;
POSTAL_TRAIN = 19;
POST_OFFICE_PARCELS_TRAIN = 20;
EMPTY_NON_PASSENGER_STOCK = 21;
DEPARTMENTAL_TRAIN = 22;
CIVIL_ENGINEER_TRAIN = 23;
MECHANICAL_AND_ELECTRICAL_ENGINEER_TRAIN = 24;
STORES_TRAIN = 25;
TEST_TRAIN = 26;
SIGNAL_AND_TELECOMMUNICATIONS_ENGINEER_TRAIN = 27;
LOCOMOTIVE_AND_BRAKE_VAN = 28;
LIGHT_LOCOMOTIVE = 29;
AUTOMOTIVE_COMPONENTS_TRAIN = 30;
AUTOMOTIVE_VEHICLE_TRAIN = 31;
EDIBLE_PRODUCTS_TRAIN = 32;
INDUSTRIAL_MINERALS_TRAIN = 33;
CHEMICAL_TRAIN = 34;
BUILDING_MATERIALS_TRAIN = 35;
GENERAL_MERCHANDISE_TRAIN = 36;
EUROPEAN_RAILFREIGHT = 37;
FREIGHTLINER_CONTRACTS = 38;
FREIGHTLINER_OTHER = 39;
COAL_TRAIN = 40;
COAL_POWER_STATION_TRAIN = 41;
COAL_OR_NUCLEAR_TRAIN = 42;
METALS_TRAIN = 43;
AGGREGATES_TRAIN = 44;
DOMESTIC_AND_INDUSTRIAL_WASTE_TRAIN = 45;
TRAINLOAD_BUILDING_MATERIALS_TRAIN = 46;
PETROLEUM_PRODUCTS_TRAIN = 47;
MIXED_FREIGHT_CHANNEL_TUNNEL_TRAIN = 48;
INTERMODAL_CHANNEL_TUNNEL_TRAIN = 49;
AUTOMOTIVE_FREIGHT_CHANNEL_TUNNEL_TRAIN = 50;
CONTRACT_FREIGHT_CHANNEL_TUNNEL_TRAIN = 51;
HAULMARK_FREIGHT_CHANNEL_TUNNEL_TRAIN = 52;
JOINT_VENTURE_CHANNEL_TUNNEL_FREIGHT_TRAIN = 53;
}
enum PowerType {
POWER_TYPE_UNSPECIFIED = 0;
DIESEL = 1;
DIESEL_MULTIPLE_UNIT = 2;
DISEL_MECHANICAL_MULTIPLE_UNIT = 3;
ELECTRIC = 4;
ELECTRO_DIESEL = 5;
EMU_PLUS_LOCOMOTIVE = 6;
ELECTRIC_MULTIPLE_UNIT = 7;
HIGH_SPEED_TRAIN = 8;
}
message OperatingCharacteristics {
bool vacuum_braked = 1; // B
bool timed_at_100mph = 2; // C
bool driver_only_operated = 3; // D
bool conveys_mk4_coaches = 4; // E
bool guard_required = 5; // G
bool timed_at_110mph = 6; // M
bool push_pull_train = 7; // P
bool runs_as_required = 8; // Q
bool air_conditioned_with_pa = 9;//R
bool steam_heated = 10;
bool runs_to_terminals_as_required = 11; // Y
bool may_convey_sb1c_gauge = 12; // Z
}
enum SleepingAccommodation {
NO_SLEEPING_ACCOMMODATION = 0;
FIRST_AND_STANDARD = 1;
FIRST_ONLY = 2;
STANDARD_ONLY = 3;
}
message Reservations {
bool reservations_available = 1;
bool reservations_compulsory = 2;
bool bike_reservations_essential = 3;
bool reservations_from_any_station = 4;
}
message Catering {
bool buffet_service = 1;
bool first_class_restaurant = 2;
bool hot_food_available = 3;
bool first_class_meal_included = 4;
bool restaurant_available = 5;
bool trolley_service = 6;
}
enum STPIndicator {
STP_INDICATOR_NOT_SPECIFIED = 0;
C = 1;
N = 2;
O = 3;
P = 4;
}
enum RecordIdentity {
RECORD_IDENTITY_NOT_SPECIFIED = 0;
ORIGIN = 1;
INTERMEDIATE = 2;
TERMINATING = 3;
}
message ScheduleLocation {
RecordIdentity record_identity = 1;
string tiploc = 2;
int32 tiploc_instance = 3;
int32 arrival_offset_seconds = 4; // Seconds after midnight
int32 departure_offset_seconds = 5;
int32 pass_offset_seconds = 6;
int32 public_arrival_offset_seconds = 7;
int32 public_departure_offset_seconds = 8;
string platform = 9;
string line = 10;
string path = 11;
int32 engineering_allowance_seconds = 12;
int32 performance_allowance_seconds = 13;
}
message SchedulePayload {
string train_uid = 1;
SchedulePayloadType transaction_type = 2;
int32 schedule_start_date = 3; // Literal int of date: eg. 20251216
int32 schedule_end_date = 4;
RunsOnDays runs_on_day_of_week = 5;
TrainStatus train_status = 6;
TrainCategory train_category = 7;
string headcode = 8; // signalling_id
string nrs_code = 9; // CIF_headcode
string train_service_code = 10;
string portion_id = 11; // CIF_business_sector
PowerType power_type = 12;
string timing_load = 13; // Pretty String in Ingress Service
OperatingCharacteristics operating_characteristics = 14;
bool first_class_available = 15;
SleepingAccommodation sleeping_accommodation = 16;
Reservations reservations = 17;
Catering catering_code = 18;
bool is_eurostar = 19;
STPIndicator stp_indicator = 20;
string uic_code = 21;
string toc_code = 22; // Maybe ENUM but subject to frequent-ish change
repeated ScheduleLocation schedule_location = 23;
}

View File

@@ -23,10 +23,11 @@
}, },
"data_kind": { "data_kind": {
"type": "string", "type": "string",
"enum": ["pis", "timetable", "knowledgebase"], "enum": ["pis", "timetable", "knowledgebase", "darwin_schedule", "darwin_ts", "darwin_ref"],
"description": "The data type contained in the message. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data" "description": "The data type contained in the message. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data"
}
}, },
"required": ["service_name", "service_id", "data_type", "sent_timestamp"], "payload": {}
"additionalProperties": true },
"required": ["service_name", "service_id", "data_type", "data_kind", "sent_timestamp"],
"additionalProperties": false
} }

View File

@@ -0,0 +1,267 @@
{
"$id": "https://schema.owlboard.info/data-ingress/pushport16-schedule.schema.json",
"$schema": "https://json-schema.org/draft-07/schema#",
"title": "PushPortSchedule",
"description": "Consolidated object definition for Darwin Schedule messages",
"definitions": {
"SchedLocAttributes": {
"type": "object",
"description": "Attributes common to all schedule locations",
"required": [
"tpl"
],
"properties": {
"tpl": {
"type": "string",
"description": "TIPLOC"
},
"act": {
"type": "string",
"default": " ",
"description": "Current Activity Codes"
},
"planAct": {
"type": "string",
"description": "Planned Activity Codes"
},
"can": {
"type": "boolean",
"default": false,
"description": "Cancelled flag"
},
"fid": {
"type": "string",
"description": "Unique identifier of the formation data (v3) "
}
}
},
"CallPtAttributes": {
"type": "object",
"description": "Attributes for Calling Points (Optional for Operational variants)",
"properties": {
"pta": {
"type": "string",
"description": "Public Scheduled Time of Arrival"
},
"ptd": {
"type": "string",
"description": "Public Scheduled Time of Departure"
},
"avgLoading": {
"type": "string",
"description": "Average Loading value based on long-term averages (v3) "
}
}
},
"originPoint": {
"description": "Merged Origin (OR / OPOR). The starting point of the journey.",
"required": [
"wtd"
],
"allOf": [
{
"$ref": "#/definitions/SchedLocAttributes"
},
{
"$ref": "#/definitions/CallPtAttributes"
},
{
"type": "object",
"properties": {
"wta": {
"type": "string",
"description": "Working Scheduled Time of Arrival (Optional)"
},
"wtd": {
"type": "string",
"description": "Working Scheduled Time of Departure (Required)"
},
"fd": {
"type": "string",
"description": "False Destination TIPLOC (Passenger only)"
}
}
}
]
},
"callingPoint": {
"description": "Merged Intermediate Point (IP / OPIP). An intermediate stop requiring dwell time.",
"required": [
"wta",
"wtd"
],
"allOf": [
{
"$ref": "#/definitions/SchedLocAttributes"
},
{
"$ref": "#/definitions/CallPtAttributes"
},
{
"type": "object",
"properties": {
"wta": {
"type": "string",
"description": "Working Scheduled Time of Arrival (Required)"
},
"wtd": {
"type": "string",
"description": "Working Scheduled Time of Departure (Required)"
},
"rdelay": {
"type": "integer",
"default": 0,
"description": "Route delay value"
},
"fd": {
"type": "string",
"description": "False Destination (Passenger only)"
}
}
}
]
},
"passPoint": {
"description": "Intermediate Passing Point (PP). Purely operational.",
"required": [
"wtp"
],
"allOf": [
{
"$ref": "#/definitions/SchedLocAttributes"
},
{
"type": "object",
"properties": {
"wtp": {
"type": "string",
"description": "Working Scheduled Time of Passing (Required)"
},
"rdelay": {
"type": "integer",
"default": 0,
"description": "Route delay value"
}
},
"additionalProperties": false
}
]
},
"destinationPoint": {
"description": "Merged Destination (DT / OPDT). The termination point of the journey.",
"required": [
"wta"
],
"allOf": [
{
"$ref": "#/definitions/SchedLocAttributes"
},
{
"$ref": "#/definitions/CallPtAttributes"
},
{
"type": "object",
"properties": {
"wta": {
"type": "string",
"description": "Working Scheduled Time of Arrival (Required)"
},
"wtd": {
"type": "string",
"description": "Working Scheduled Time of Departure (Optional)"
},
"rdelay": {
"type": "integer",
"default": 0,
"description": "Route delay value"
}
}
}
]
}
},
"type": "object",
"properties": {
"service_name": {
"type": "string",
"description": "Name of the service submitting the update"
},
"service_id": {
"type": "string",
"description": "ID of the service sending the message - usually a hostname"
},
"data_type": {
"type": "string",
"const": "PushPort16Schedule",
"description": "The type of data contained in this message object"
},
"sent_timestamp": {
"type": "integer",
"description": "Unix timestamp representing the time the message was sent"
},
"data_kind": {
"type": "string",
"const": "PushPort16Schedule",
"description": "The data type contained in the message. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data"
},
"payload": {
"type": "object",
"required": [
"rid",
"uid",
"trainId",
"ssd",
"toc",
"locations"
],
"properties": {
"rid": {"type": "string", "description": "Rail Identifier - Unique value for the service"},
"uid": {"type": "string", "description": "Unique ID - Unique value for the timetable entry - maps to Network Rail CIF schedules"},
"ssd": {"type": "string", "format": "date", "description": "Service Start Date - The date the service commences"},
"trainId": {"type": "string", "description": "Headcode"},
"toc": {"type": "string", "minLength": 2, "maxLength": 2, "description": "Train Operator (ATOC Code)"},
"rsid": {"type": "string", "description": "Retail Service ID"},
"status": {"type": "string", "default": "P", "description": "P = Permanent, L = Long Term, S = Short Term"},
"trainCat": {"type": "string", "default": "OO", "description": "Train Category"},
"isPassenger": {"type": "boolean", "default": true, "description": "Declares the service as a passenger service"},
"isActive": {"type": "boolean", "default": false, "description": "UNKNOWN"},
"isCharter": {"type": "boolean", "default": false, "description": "Declares the service as a charter service"},
"cancelReason": {"type": "integer", "description": "Cancellation Reason code"},
"locations": {
"type": "object",
"description": "Merged and flattened location objects",
"properties": {
"OR": {
"type": "array",
"description": "OR/OPOR Values - Trains Origin",
"items": {"$ref": "#/definitions/originPoint"}
},
"IP": {
"type": "array",
"description": "IP/OPIP Values - Intermediate Points",
"items": {"$ref": "#/definitions/callingPoint"}
},
"PP": {
"type": "array",
"description": "Passing Points (Non-stop)",
"items": {"$ref": "#/definitions/passPoint"}
},
"DT": {
"type": "array",
"description": "DT/OPDT Values - Trains Destination",
"items": {"$ref": "#/definitions/destinationPoint"}
}
}
}
}
}
},
"required": [
"service_name",
"service_id",
"data_type",
"sent_timestamp"
],
"additionalProperties": false
}

View File

View File

@@ -0,0 +1,241 @@
{
"$id": "https://schema.owlboard.info/data-ingress/pushport-schedule.schema.json",
"$schema": "https://json-schema.org/draft-07/schema#",
"title": "PushPortSchedule",
"type": "object",
"properties": {
"service_name": {
"type": "string",
"description": "Name of the service submitting the update"
},
"service_id": {
"type": "string",
"description": "ID of the service sending the message - usually a hostname"
},
"data_type": {
"type": "string",
"const": "PushPortSchedule",
"description": "The type of data contained in this message object"
},
"sent_timestamp": {
"type": "integer",
"description": "Unix timestamp representing the time the message was sent"
},
"data_kind": {
"type": "string",
"enum": [
"pis",
"timetable",
"knowledgebase",
"darwin_schedule",
"darwin_ts",
"darwin_ref"
],
"description": "The data type contained in the message. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data"
},
"payload": {
"type": "object",
"required": [
"rid",
"uid",
"trainId",
"ssd",
"toc",
"locations"
],
"properties": {
"rid": {
"type": "string",
"description": "Unique service ID"
},
"uid": {
"type": "string",
"description": "Unique schedule ID - maps to NR CIF"
},
"trainId": {
"type": "string",
"description": "Train Headcode"
},
"ssd": {
"type": "string",
"format": "date",
"description": "Schedule Start Date (When the service commences)"
},
"toc": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "TOC Code"
},
"isPassenger": {
"type": "boolean",
"description": "If service is for passengers",
"default": true
},
"isCharter": {
"type": "boolean",
"description": "If train is charter service",
"default": false
},
"status": {
"type": "string",
"enum": [
"train",
"bus",
"ship"
],
"default": "train"
},
"isDelayedDelivery": {
"type": "boolean",
"description": "If message is sent as part of Darwin service recovery"
},
"cancelReason": {
"type": [
"string",
"null"
],
"description": "Reason code for cancellation"
},
"isDeleted": {
"type": "boolean",
"description": "Whether schedule should be deleted",
"default": false
},
"locations": {
"type": "array",
"items": {
"type": "object",
"required": [
"tpl",
"seq"
],
"properties": {
"tpl": {
"type": "string",
"description": "TIPLOC of location"
},
"seq": {
"type": "integer",
"description": "The order of the stop for sorting and handling repeated TIPLOCs"
},
"wta": {
"type": [
"string",
"null"
]
},
"wtd": {
"type": [
"string",
"null"
]
},
"wtp": {
"type": [
"string",
"null"
]
},
"pta": {
"type": [
"string",
"null"
]
},
"ptd": {
"type": [
"string",
"null"
]
},
"plat": {
"type": [
"string",
"null"
]
},
"isCancelled": {
"type": "boolean",
"default": false
},
"isSupressed": {
"type": "boolean",
"default": false,
"description": "Defines whether the service should be hidden to the public"
},
"activities": {
"type": "object",
"properties": {
"pass": {
"type": "boolean",
"description": "Indicates that the train does not stop, it only passes this location"
},
"pickUpDropOff": {
"type": "boolean",
"description": "Indicates the train stops for passengers to board and alight"
},
"requestStop": {
"type": "boolean",
"description": "Indicates if the train stops only when required"
},
"pickUpOnly": {
"type": "boolean",
"description": "Indicated the service picks up passengers only"
},
"dropOffOnly": {
"type": "boolean",
"description": "Indicates the service drops off passengers only"
},
"tokenExchange": {
"type": "boolean",
"description": "Indicates if the train stops for exhanging a token/staff or similar"
},
"vehiclesAttached": {
"type": "boolean",
"description": "Indicates if vehicles are attached at this location"
},
"vehiclesDetached": {
"type": "boolean",
"description": "Indicates if vehicles are detached at this location"
},
"trainCrewChange": {
"type": "boolean",
"description": "Indicates if train stops to exchange crew at this location"
},
"changeLocomotive": {
"type": "boolean",
"description": "Indicates if train stops to exchange locomotive at this location"
},
"changeEnds": {
"type": "boolean",
"description": "Indicates if the train reverses or driver changes ends at this location"
},
"staffStop": {
"type": "boolean",
"description": "Indicates that the train stops for staff use only"
},
"unadvertised": {
"type": "boolean",
"description": "Indicates that the stop is not advertised to the public"
},
"passesAnotherTrain": {
"type": "boolean",
"description": "Indicates if the train stops to pass another train on a single line crossing point"
}
}
}
}
}
}
}
}
},
"required": [
"service_name",
"service_id",
"data_type",
"sent_timestamp"
],
"additionalProperties": true
}

View File

@@ -0,0 +1,39 @@
{
"$id": "https://schema.owlboard.info/data-ingress/pushport-ts.schema.json",
"$schema": "https://json-schema.org/draft-07/schema#",
"title": "PushPortTS",
"type": "object",
"properties": {
"rid": {
"type": "string",
"description": "Unique ID for the train service (eg. 2026022217610103)",
"pattern": "^[0-9]{15}$"
},
"uid": {
"type": "string",
"description": "Schedule ID - The permanent ID for the schedule in the static timetable"
},
"ssd": {
"type": "string",
"format": "date",
"description": "Scheduled Start Data, the date the train service started its journey"
},
"isDelayed": {
"type": "boolean",
"description": "Indicated if the message is delayed due to PushPort service disruption"
},
"lateReason": {
"type": "integer",
"description": "Reason the train is late (Maps to textual reason)"
},
"cancelReason": {
"type": "integer",
"description": "Reason the train is cancelled (Maps to textual reason)"
},
"locations": {
"type": "array",
"description": "A list of one or more locations where the train has recorded a movement or forecast",
"items": { "$ref": "https://schema.owlboard.info/data-ingress/pushport-ts-location.schema.json" }
}
}
}

View File

@@ -0,0 +1,51 @@
{
"$id": "https://schema.owlboard.info/data-ingress/pushport-ts-location.schema.json",
"$schema": "https://json-schema.org/draft-07/schema#",
"title": "PushPortTSLocation",
"type": "object",
"required": ["tpl"],
"definitions": {
"TSTime": {
"type": "object",
"properties": {
"at": {"type": "string", "description": "Actual time"},
"et": {"type": "string", "description": "Estimated time"},
"wet": {"type": "string", "description": "Working estimated time"},
"src": {"type": "string", "description": "Data source (TD/Darwin/etc)"},
"atClass": {"type": "string", "description": "Time source Automatic/Manual"},
"delayed": {"type": "boolean", "description": "is train delayed with no estimated time"},
"srcInst": {"type": "string", "description": "Source instance (what caused the update)"},
"atRemoved": {"type": "boolean", "description": "Whether a previous 'at' was reported in error and should be removed"}
}
}
},
"properties": {
"tpl": {"type": "string", "description": "TIPLOC for the location"},
"wta": {"type": "string", "description": "Scheduled working time arrival"},
"wtd": {"type": "string", "description": "Scheduled working time departure"},
"wtp": {"type": "string", "description": "Scheduled working time pass"},
"pta": {"type": "string", "description": "Scheduled public arrival time"},
"ptd": {"type": "string", "description": "Scheduled public departure time"},
"arr": {"$ref": "#/definitions/TSTime"},
"dep": {"$ref": "#/definitions/TSTime"},
"pass": {"$ref": "#/definitions/TSTime"},
"plat": {
"type": "object",
"description": "Platform data",
"properties": {
"value": {"type": "string", "description": "Platform number/letter"},
"platsrc": {"type": "string", "enum": ["A", "M", "P"], "description": "Source of data Automatic/Manual/Planned"},
"platsup": {"type": "boolean", "description": "Is platform suppressed from public display"},
"cisPlatsup": {"type": "boolean", "description": "Whether CIS or Darwin Workstation has supressed the platform"},
"conf": {"type": "boolean", "description": "Whether platform has been confirmed by the local CIS"}
}
},
"suppr": {"type": "boolean", "description": "Whether location is supressed"},
"length": {"type": "integer", "description": "Train length (no. of coaches)"},
"detachFront": {"type": "boolean","description": "Indicated if coaches will detatch from front"},
"detachRead": {"type": "boolean", "description": "Indicates if coaches will detatch from rear"},
"attachFront": {"type": "boolean", "description": "Indicates if coaches will attach to front"},
"attachRear": {"type": "boolean", "description": "Indicates if coaches will be attached to rear"},
"adhoc": {"type": "boolean", "description": "Whether this is an ad-hoc stop"}
}
}