1/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17syntax = "proto3";
18
19package android.car.cluster.navigation;
20
21option java_package = "android.car.cluster.navigation";
22option java_outer_classname = "NavigationState";
23
24// A reference to an image. This consists of a 'content://' style URI plus
25// attributes describing the image.
26//
27// Sizing: The aspect ratio of the image is given in aspect_ratio.
28//         When requesting the image using this URI a 'w' and 'h' parameter
29//         must be added to the URI parameter list to request an image size.
30//         There is no guarantee that the specific size requested will actually
31//         be returned, however.
32// Margins: The referenced image does not have internal margins.
33// Format: Content URI must reference a file with MIME type
34//         'image/png', 'image/jpeg' or 'image/bmp'.
35// Color: Images can be either "tintable" or not. A "tintable" image is such that
36//        all its content is defined in its alpha channel, while its color
37//        (all other channels) can be altered without losing information
38//        (e.g. icons). A non "tintable" images contains information in all its
39//        channels (e.g. photos).
40// Caching: Given the same image reference and the same requested size,
41//          it is assumed that the exact same image will always be returned.
42//          This means that it should be safe to cache an image once requested
43//          the first time, using this image reference plus requested size as key,
44//          for as long as needed.
45message ImageReference {
46  // A URI defining the location that the image can be retrieved from.
47  //
48  // When requesting the image from this URI, a desired image size must be
49  // specified by editing the parameter list to add the following two
50  // parameters:
51  //   w: width desired maximum width (must be greater than 0)
52  //   h: height desired maximum height (must be greater than 0)
53  //
54  // For example, if the `content_uri` is
55  // `content://some.package.name/some/path`, then the request must be:
56  // `content://some.package.name/some/path?w=<width>&h=<height>` (with <width>
57  // and <height> replaced with the requested values).
58  //
59  // Note that the resulting image is not guaranteed to match the requested
60  // size.
61  string content_uri = 1;
62
63  // The aspect ratio of the image, being width divided by height.
64  double aspect_ratio = 2;
65
66  // Indicates whether this image is "tintable" or not.
67  // An image is "tintable" when all its content is defined in its
68  // alpha-channel, designed to be colorized
69  // (e.g. using android.graphics.PorterDuff.Mode#SRC_ATOP image composition).
70  bool is_tintable = 3;
71}
72
73// Distance along the planned route between relevant points in the navigation
74message Distance {
75  // Possible units used to display this distance.
76  enum Unit {
77    // Display unit is unknown, no distance information should be displayed.
78    UNKNOWN = 0;
79    METERS = 1;
80    KILOMETERS = 2;
81    MILES = 3;
82    FEET = 4;
83    YARDS = 5;
84  }
85
86  // The distance in meters.
87  int32 meters = 1;
88
89  // The distance measured in the unit indicated at `display_units`, already
90  // internationalized and ready for display, or empty if no distance value was
91  // provided. If empty, the distance shouldn’t be displayed to the driver.
92  //
93  // This distance is for display only (it might be a rounded representation of
94  // the actual distance) and must match the distance displayed anywhere else
95  // in the vehicle.
96  //
97  // For example, a distance of 1200 meters in ES_es locale could be
98  // represented with `display_value` of "1,2" and `display_units` of KILOMETERS.
99  string display_value = 2;
100
101  // The distance unit that should be used to display the distance value
102  // (adjusted to the current user's locale and/or location). This matches the
103  // unit used in `display_value`.
104  Unit display_units = 3;
105}
106
107// Information about a maneuver that the driver will be required to perform.
108message Maneuver {
109
110  // Next ID: 57
111  enum Type {
112    // Maneuver type is unknown, no maneuver information should be displayed.
113    UNKNOWN = 0;
114
115    // Starting point of the navigation (e.g. "Start driving on Main St.")
116    DEPART = 1;
117
118    // No turn, but the street name changes (e.g. "Continue on Main St.")
119    NAME_CHANGE = 2;
120
121    // No turn, from 0 (included) to 10 (excluded) degrees. Used when we just
122    // wish to say "Keep left" or "Keep right". Note that this is used in
123    // contrast to STRAIGHT for disambiguating cases where there is more than
124    // one option to go into the same general direction.
125    KEEP_LEFT = 3;
126    KEEP_RIGHT = 4;
127
128    // Slight turn at an intersection, from 10 (included) to 45 (excluded)
129    // degrees.
130    TURN_SLIGHT_LEFT = 5;
131    TURN_SLIGHT_RIGHT = 6;
132
133    // Regular turn at an intersection, from 45 (included) to 135 (excluded)
134    // degrees.
135    TURN_NORMAL_LEFT = 7;
136    TURN_NORMAL_RIGHT = 8;
137
138    // Sharp turn at an intersection, from 135 (included) to 175 (excluded)
139    // degrees
140    TURN_SHARP_LEFT = 9;
141    TURN_SHARP_RIGHT = 10;
142
143    // A turn onto the opposite side of the same street, from 175 (included) to
144    // 180 (included) degrees.
145    U_TURN_LEFT = 11;
146    U_TURN_RIGHT = 12;
147
148    // A turn to enter a turnpike or freeway. See TURN_NORMAL_LEFT,
149    // TURN_SLIGHT_RIGHT, etc., for the difference between slight, sharp, etc.
150    ON_RAMP_SLIGHT_LEFT = 13;
151    ON_RAMP_SLIGHT_RIGHT = 14;
152    ON_RAMP_NORMAL_LEFT = 15;
153    ON_RAMP_NORMAL_RIGHT = 16;
154    ON_RAMP_SHARP_LEFT = 17;
155    ON_RAMP_SHARP_RIGHT = 18;
156    ON_RAMP_U_TURN_LEFT = 19;
157    ON_RAMP_U_TURN_RIGHT = 20;
158
159    // A turn to exit a turnpike or freeway. See TURN_NORMAL_LEFT,
160    // TURN_SLIGHT_RIGHT, etc., for the difference between slight, sharp, etc.
161    OFF_RAMP_SLIGHT_LEFT = 21;
162    OFF_RAMP_SLIGHT_RIGHT = 22;
163    OFF_RAMP_NORMAL_LEFT = 23;
164    OFF_RAMP_NORMAL_RIGHT = 24;
165
166    // Road diverges (e.g. "Keep left/right at the fork").
167    FORK_LEFT = 25;
168    FORK_RIGHT = 26;
169
170    // Current road joins another (e.g. "Merge left/right onto Main St.").
171    MERGE_LEFT = 27;
172    MERGE_RIGHT = 28;
173    MERGE_SIDE_UNSPECIFIED = 54;
174
175    // Roundabout entrance on which the current road ends (e.g. "Enter the
176    // roundabout").
177    ROUNDABOUT_ENTER = 29;
178
179    // Used when leaving a roundabout when the step starts in it (e.g. "Exit
180    // the roundabout").
181    ROUNDABOUT_EXIT = 30;
182
183    // The following are entrance and exit (e.g. "At the roundabout, take Nth
184    // exit") on a clockwise roundabout (as seen from above, typical for
185    // left-hand drive countries) where the exit is a particular turn amount
186    // (sharp right, vs. normal left, etc. - see the definitions for
187    // TURN_SHARP_LEFT, TURN_SLIGHT_RIGHT, etc., for a definition of what "sharp"
188    // vs. "normal" vs. "slight" is.
189    ROUNDABOUT_ENTER_AND_EXIT_CW = 55;
190    ROUNDABOUT_ENTER_AND_EXIT_CW_SHARP_RIGHT = 31;
191    ROUNDABOUT_ENTER_AND_EXIT_CW_NORMAL_RIGHT = 32;
192    ROUNDABOUT_ENTER_AND_EXIT_CW_SLIGHT_RIGHT = 33;
193    ROUNDABOUT_ENTER_AND_EXIT_CW_STRAIGHT = 34;
194    ROUNDABOUT_ENTER_AND_EXIT_CW_SHARP_LEFT = 35;
195    ROUNDABOUT_ENTER_AND_EXIT_CW_NORMAL_LEFT = 36;
196    ROUNDABOUT_ENTER_AND_EXIT_CW_SLIGHT_LEFT = 37;
197    ROUNDABOUT_ENTER_AND_EXIT_CW_U_TURN = 38;
198
199    // The following are entrance and exit (e.g. "At the roundabout, take Nth
200    // exit") on a counter-clockwise roundabout (as seen from above, typical
201    // for right-hand drive countries) where the exit is a particular turn
202    // amount (sharp right, vs. normal left, etc. - see the definitions for
203    // TURN_SHARP_LEFT, TURN_SLIGHT_RIGHT, etc., for a definition of what "sharp"
204    // vs. "normal" vs. "slight" is.
205    ROUNDABOUT_ENTER_AND_EXIT_CCW = 56;
206    ROUNDABOUT_ENTER_AND_EXIT_CCW_SHARP_RIGHT = 39;
207    ROUNDABOUT_ENTER_AND_EXIT_CCW_NORMAL_RIGHT = 40;
208    ROUNDABOUT_ENTER_AND_EXIT_CCW_SLIGHT_RIGHT = 41;
209    ROUNDABOUT_ENTER_AND_EXIT_CCW_STRAIGHT = 42;
210    ROUNDABOUT_ENTER_AND_EXIT_CCW_SHARP_LEFT = 43;
211    ROUNDABOUT_ENTER_AND_EXIT_CCW_NORMAL_LEFT = 44;
212    ROUNDABOUT_ENTER_AND_EXIT_CCW_SLIGHT_LEFT = 45;
213    ROUNDABOUT_ENTER_AND_EXIT_CCW_U_TURN = 46;
214
215    // Driver should steer straight.
216    STRAIGHT = 47;
217
218    // Drive towards a boat ferry for vehicles (e.g. "Take the ferry").
219    FERRY_BOAT = 48;
220
221    // Drive towards a train ferry for vehicles (e.g. "Take the train").
222    FERRY_TRAIN = 49;
223
224    // Arrival to a destination where the direction is unknown.
225    DESTINATION = 50;
226
227    // Arrival to a destination located in a particular direction (straight
228    // ahead, left side of the road, right side of the road).
229    DESTINATION_STRAIGHT = 51;
230    DESTINATION_LEFT = 52;
231    DESTINATION_RIGHT = 53;
232  }
233
234  // The type of the maneuver.
235  Type type = 1;
236
237  // The roundabout exit number, starting from 1 to designate the first exit
238  // after joining the roundabout, and increasing in circulation order.
239  // Only relevant if type is ROUNDABOUT_EXIT or any variation of
240  // ROUNDABOUT_ENTER_AND_EXIT.
241  //
242  // For example, if the driver is joining a counter-clockwise roundabout
243  // with 4 exits, then the exit to the right would be exit #1, the one
244  // straight ahead would be exit #2, the one to the left would be exit #3
245  // and the one used by the driver to join the roundabout would be exit #4.
246  int32 roundabout_exit_number = 2;
247
248  // A reference to an image representing this maneuver,
249  // or not present if image representation is not available.
250  ImageReference icon = 3;
251}
252
253// Configuration of a single lane of a road at a particular point in the
254// navigation. It describes all possible directions the driver could go
255// from this lane, and indicates which directions the driver could take
256// to stay on the navigation route.
257message Lane {
258  // One of the possible directions a driver can go when using a particular
259  // lane at a particular step in the navigation. This defines the icon(s)
260  // that must be combined to display a lane configuration to the user.
261  message LaneDirection {
262    enum Shape {
263      // The shape is unknown, in which case no lane information should be
264      // shown.
265      UNKNOWN = 0;
266
267      // No turn.
268      STRAIGHT = 1;
269
270      // Slight left turn, from 10 (included) to 45 (excluded) degrees.
271      SLIGHT_LEFT = 2;
272
273      // Slight right turn, from 10 (included) to 45 (excluded) degrees.
274      SLIGHT_RIGHT = 3;
275
276      // Regular left turn, from 45 (included) to 135 (excluded) degrees.
277      NORMAL_LEFT = 4;
278
279      // Regular right turn, from 45 (included) to 135 (excluded) degrees.
280      NORMAL_RIGHT = 5;
281
282      // Sharp left turn, from 135 (included) to 175 (excluded) degrees.
283      SHARP_LEFT = 6;
284
285      // Sharp right turn, from 135 (included) to 175 (excluded) degrees.
286      SHARP_RIGHT = 7;
287
288      // A left turn onto the opposite side of the same street, from 175
289      // (included) to 180 (included) degrees
290      U_TURN_LEFT = 8;
291
292      // A right turn onto the opposite side of the same street, from 175
293      // (included) to 180 (included) degrees
294      U_TURN_RIGHT = 9;
295    }
296
297    // The shape of this lane direction.
298    Shape shape = 1;
299
300    // True if this is a valid direction the driver can take in order to stay
301    // in the navigation route, or false if it will take the drive off the
302    // navigation route.
303    bool is_highlighted = 2;
304  }
305
306  // The possible directions a driver can take from this lane.
307  repeated LaneDirection lane_directions = 1;
308}
309
310// An instruction to a user to perform an action during their drive composed of
311// a sequence of graphic elements (e.g. text, images) to be displayed
312// one after another.
313//
314// Each sequence will have a plain text representation in `alternate_text`
315// and in the case of the absence of a rich representation,
316// the sequence of elements in `elements` may be left empty.
317// The textual representation may also be used as a fallback for when the
318// elements fail to render.
319message Cue {
320  // One item in the sequence that makes up a Cue,
321  // a sequence of graphic elements that can be displayed one after another.
322  //
323  // A CueElement can contain text, a graphic element, or both.
324  // The text of a CueElement with an image reference should be representative
325  // of the image.
326  //
327  // The image should be rendered if possible instead of the
328  // text. Otherwise, `CueElement.text` should be used as a fallback.
329  //
330  // If rendering fails and the text is empty, then no elements in the sequence
331  // should be rendered and `Cue.alternate_text` must be used instead.
332  //
333  // New graphic elements might be added in the future. If such elements are
334  // unknown to the OEM rendering service, they will be delivered as text.
335  message CueElement {
336    // The textual representation of this element.
337    //
338    // If image is provided, then this is used as a fallback in the case of
339    // render failures, otherwise this is the string to be used when rendering
340    // this element.
341    string text = 1;
342
343    // An image representing this element. This representation should be used
344    // over the textual representation whenever possible.
345    //
346    // In case of failure to render, `text` should be shown instead. If
347    // rendering fails and text is empty, then no elements should be shown and
348    // instead the `alternate_text` should be shown.
349    ImageReference image = 2;
350  }
351
352  // The sequence of graphic elements.
353  //
354  // If no rich cue representation is available,
355  // the list may be empty and `alternate_text` should be used as a fallback.
356  // Spacing between the elements is provided, and rendering services should
357  // not attempt to add their own spacing between the CueElement objects.
358  repeated CueElement elements = 1;
359
360  // The plain-text string representing the content of this Cue.
361  string alternate_text = 2;
362}
363
364// An action that the driver should take in order to remain on the current
365// navigation route.
366//
367// For example: turning onto a street, taking a highway exit and merging onto
368// a different highway, continuing straight through a roundabout, etc.
369message Step {
370  // The distance from the current position to the point where
371  // this navigation step should be executed.
372  Distance distance = 1;
373
374  // The maneuver to be performed on this step,
375  // or not present if this step doesn't involve a maneuver.
376  Maneuver maneuver = 2;
377
378  // The configuration of road lanes at the point where the driver should
379  // execute this step, or an empty list if lane configuration metadata
380  // is not available. Lane configurations are listed from left to right.
381  repeated Lane lanes = 3;
382
383  // An image representing the lane configuration at this point in the
384  // navigation, or not present if the lanes configuration image was not
385  // provided. The image, if provided, is expected to contain:
386  //   - A representation of all lanes, one next to the other in a single row.
387  //   - For each lane, a set of arrows, representing each possible driving
388  //     direction (e.g. straight, left turn, etc.) within such lane.
389  //   - Each of such driving directions that would keep the driver within
390  //     the navigation route should be highlighted.
391  // Lane configuration images are expected to be displayed in a canvas
392  // with fixed height and variable width.
393  ImageReference lanes_image = 4;
394
395  // Auxiliary instructions on how to complete this navigation step,
396  // described as a Cue object containing a sequence of texts
397  // (e.g. "onto ", "Wallaby way") and images (e.g. road badge of a highway).
398  // Separators, such as spaces, should be provided in the sequence.
399  // If space is not enough to display the complete content of this Cue
400  // instance, the beginning of these instructions must be displayed,
401  // cutting as much from the end as needed to fit.
402  Cue cue = 5;
403}
404
405// An object representing a latitude/longitude pair. This is expressed as a pair
406// of doubles representing degrees latitude and degrees longitude. Unless
407// specified otherwise, this must conform to the WGS84 standard
408// (http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf) Values must be
409// within normalized ranges.
410//
411// Copied from:
412// https://github.com/googleapis/googleapis/blob/master/google/type/latlng.proto
413message LatLng {
414  // The latitude in degrees. It must be in the range [-90.0, +90.0].
415  double latitude = 1;
416  // The longitude in degrees. It must be in the range [-180.0, +180.0].
417  double longitude = 2;
418}
419
420// A Timestamp represents a point in time independent of any time zone
421// or calendar, represented as seconds and fractions of seconds at
422// nanosecond resolution in UTC Epoch time. It is encoded using the
423// Proleptic Gregorian Calendar which extends the Gregorian calendar
424// backwards to year one. It is encoded assuming all minutes are 60
425// seconds long, i.e. leap seconds are "smeared" so that no leap second
426// table is needed for interpretation. Range is from
427// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
428// By restricting to that range, we ensure that we can convert to
429// and from  RFC 3339 date strings.
430// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
431//
432// This is a subset of
433// https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/timestamp.proto
434message Timestamp {
435  // Reserved fields
436  reserved 2;
437
438  // Represents seconds of UTC time since Unix epoch
439  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
440  // 9999-12-31T23:59:59Z inclusive.
441  int64 seconds = 1;
442}
443
444// Final or intermediate stop in a navigation route.
445message Destination {
446  // Congestion level on the way to a destination,
447  // compared to ideal driving conditions.
448  enum Traffic {
449    // Traffic information is not available
450    UNKNOWN = 0;
451
452    // High amount of traffic
453    HIGH = 1;
454
455    // Intermediate amount of traffic
456    MEDIUM = 2;
457
458    // Traffic level close to free flow
459    LOW = 3;
460  }
461
462  // The name of the destination (formatted for the current user's locale),
463  // or empty if destination name is unknown.
464  string title = 1;
465
466  // The address of the destination (formatted for the current user's locale),
467  // or empty if there is no address associated with this destination
468  string address = 2;
469
470  // The travel distance along the route from the current position to this
471  // destination, or not set if distance was not provided or is unknown.
472  Distance distance = 3;
473
474  // The estimated time at arrival at this destination,
475  // or not set if it was not provided or is unknown.
476  Timestamp estimated_time_at_arrival = 4;
477
478  // The timezone at destination (for example, ‘Europe/Paris’)
479  string zone_id = 5;
480
481  // The geo-location of this destination,
482  // or not set if not provided or unknown.
483  LatLng location = 6;
484
485  // The congestion level on the route to this destination,
486  // compared to to ideal driving conditions.
487  Traffic traffic = 7;
488
489  // The estimated duration between now and arrival, formatted for desired
490  // rounding (formatted for the current user's locale). For example, a
491  // duration of seven minutes and 15 seconds could be set here as "7 min".
492  string formatted_duration_until_arrival = 8;
493}
494
495// The description for a road.
496message Road {
497  // Name of the road, for example "Main St" or "101-S".
498  string name = 1;
499}
500
501// Navigation state data to be displayed on the instrument cluster of a car.
502// This is composed of:
503//   - a list of destinations
504//   - the immediate step or steps in order to drive towards those destinations
505message NavigationStateProto {
506  // The navigation steps, in order of execution.
507  // It is up to the third-party navigation app to decide how many steps in
508  // advance will be provided (and need not be truncated by an upcoming
509  // destination).
510  repeated Step steps = 1;
511
512  // The destinations and intermediate stops in the navigation,
513  // sorted in the order in which the driver will arrive to them.
514  repeated Destination destinations = 2;
515
516  // The current road being driven, may not be set if the road
517  // being driven is unknown. This indicates where the driver is at the moment.
518  Road current_road = 3;
519
520  enum ServiceStatus {
521    // Service status is not known or an unknown value is specified.
522    SERVICE_STATUS_UNSPECIFIED = 0;
523
524    // Default service status,
525    // indicating that navigation state data is valid and up-to-date.
526    NORMAL = 1;
527
528    // New navigation information is being fetched, and an updated navigation
529    // state will be provided soon. OEM rendering services can use this signal
530    // to display a progress indicator to the user.
531    REROUTING = 2;
532  }
533
534  // Current status of the navigation.
535  ServiceStatus service_status = 4;
536}
537