JaiaBot  1.12.0+18+g85da5f82
JaiaBot micro-AUV software
jaia_dccl.proto
Go to the documentation of this file.
1 syntax = "proto2";
2 
3 import "dccl/option_extensions.proto";
4 import "jaiabot/messages/mission.proto";
5 import "jaiabot/messages/geographic_coordinate.proto";
6 import "jaiabot/messages/high_control.proto";
7 import "goby/middleware/protobuf/coroner.proto";
8 import "jaiabot/messages/health.proto";
9 import "jaiabot/messages/imu.proto";
10 import "jaiabot/messages/option_extensions.proto";
11 
12 package jaiabot.protobuf;
13 
14 message Command
15 {
16  /*
17  Actual maximum size of message: 179 bytes / 1432 bits
18  dccl.id head...........................8
19  user head..............................0
20  body................................1423
21  padding to full byte...................1
22  Allowed maximum size of message: 250 bytes / 2000 bits
23  */
24  option (dccl.msg) = {
25  id: 80
26  max_bytes: 250
27  codec_version: 4
28  unit_system: "si"
29  };
30 
31  required uint32 bot_id = 1 [
32  (dccl.field) = { min: 0 max: 255 },
33  (jaia.field).rest_api.presence = OMITTED // specified in 'targets'
34  ];
35  required uint64 time = 2 [
36  (dccl.field) = {
37  codec: "dccl.time2"
38  units { prefix: "micro" derived_dimensions: "time" }
39  precision: -6 // second precision
40 
41  },
42  (jaia.field).rest_api.presence = OMITTED // written by API server
43  ];
44 
45  enum CommandType
46  {
47  // pre mission
48  MISSION_PLAN = 1 [(jaia.ev).rest_api.presence = GUARANTEED];
49  ACTIVATE = 2 [(jaia.ev).rest_api.presence = GUARANTEED];
50  START_MISSION = 3 [(jaia.ev).rest_api.presence = GUARANTEED];
51  MISSION_PLAN_FRAGMENT = 4;
52 
53  // during any mission
54  NEXT_TASK = 10 [(jaia.ev).rest_api.presence = GUARANTEED];
55  RETURN_TO_HOME = 11 [(jaia.ev).rest_api.presence = GUARANTEED];
56  STOP = 12 [(jaia.ev).rest_api.presence = GUARANTEED];
57  PAUSE = 13 [(jaia.ev).rest_api.presence = GUARANTEED];
58  RESUME = 14 [(jaia.ev).rest_api.presence = GUARANTEED];
59 
60  // during remote control mission
61  REMOTE_CONTROL_SETPOINT = 20;
62  REMOTE_CONTROL_TASK = 21;
63  REMOTE_CONTROL_RESUME_MOVEMENT = 22;
64 
65  // post mission
66  RECOVERED = 30 [(jaia.ev).rest_api.presence = GUARANTEED];
67  SHUTDOWN = 31 [(jaia.ev).rest_api.presence = GUARANTEED];
68  RETRY_DATA_OFFLOAD = 32;
69  DATA_OFFLOAD_COMPLETE = 33;
70  DATA_OFFLOAD_FAILED = 34;
71 
72  // debugging low level commands
73  RESTART_ALL_SERVICES = 40;
74  REBOOT_COMPUTER = 41;
75  SHUTDOWN_COMPUTER = 42;
76  }
77 
78  required CommandType type = 10
79  [(jaia.field).rest_api.presence = GUARANTEED];
80 
81  oneof command_data
82  {
83  // required for type == MISSION_PLAN
84  MissionPlan plan = 20 [(jaia.field).rest_api = { presence: GUARANTEED, doc: "Used with \"command\": { \"type\" : \"MISSION_PLAN\" }"}];
85 
86  // required for type == REMOTE_CONTROL_SETPOINT
87  RemoteControl rc = 30 [(jaia.field).rest_api = { presence: GUARANTEED, doc: "Used with \"command\": { \"type\" : \"REMOTE_CONTROL_SETPOINT\" }"}];
88 
89  // required for type == REMOTE_CONTROL_TASK
90  MissionTask rc_task = 31;
91  }
92 }
93 
94 message CommandForHub
95 {
96  option (dccl.msg) = {
97  unit_system: "si"
98  };
99 
100  required uint32 hub_id = 1 [(jaia.field).rest_api.presence = OMITTED];
101  required uint64 time = 2 [
102  (dccl.field) = { units { prefix: "micro" derived_dimensions: "time" } },
103  (jaia.field).rest_api.presence = OMITTED
104  ];
105 
106  enum HubCommandType
107  {
108  SCAN_FOR_BOTS = 5;
109 
110  // debugging low level commands
111  RESTART_ALL_SERVICES = 40;
112  REBOOT_COMPUTER = 41;
113  SHUTDOWN_COMPUTER = 42;
114 
115  // simulator commands
116  SET_HUB_LOCATION = 80 [(jaia.ev).rest_api.presence = GUARANTEED];
117  }
118 
119  required HubCommandType type = 10
120  [(jaia.field).rest_api.presence = GUARANTEED];
121 
122  optional uint32 scan_for_bot_id = 11;
123 
124  optional GeographicCoordinate hub_location = 80
125  [(jaia.field).rest_api.presence = GUARANTEED];
126 }
127 
128 message BotStatus
129 {
130  /*
131  Actual maximum size of message: 54 bytes / 432 bits
132  dccl.id head...........................8
133  user head..............................0
134  body.................................417
135  padding to full byte...................7
136  Allowed maximum size of message: 250 bytes / 2000 bits
137  */
138  option (dccl.msg) = {
139  id: 81
140  max_bytes: 250
141  codec_version: 4
142  unit_system: "si"
143  };
144 
145  required uint32 bot_id = 1 [
146  (dccl.field) = { min: 0 max: 255 },
147  (jaia.field).rest_api.presence = GUARANTEED
148  ];
149  required uint64 time = 2 [
150  (dccl.field) = {
151  codec: "dccl.time2"
152  units { prefix: "micro" derived_dimensions: "time" },
153  },
154  (jaia.field).rest_api.presence = GUARANTEED
155  ];
156  optional uint64 last_command_time = 3 [
157  (dccl.field) = {
158  codec: "dccl.time2"
159  units { prefix: "micro" derived_dimensions: "time" }
160  },
161  (jaia.field).rest_api.presence = GUARANTEED
162  ];
163 
164  optional goby.middleware.protobuf.HealthState health_state = 4
165  [(jaia.field).rest_api.presence = GUARANTEED];
166  repeated Error error = 5 [
167  (dccl.field).max_repeat = 5,
168  (jaia.field).rest_api.presence = GUARANTEED
169  ];
170  repeated Warning warning = 6 [
171  (dccl.field).max_repeat = 5,
172  (jaia.field).rest_api.presence = GUARANTEED
173  ];
174  enum BotType
175  {
176  HYDRO = 1 [(jaia.ev).rest_api.presence = GUARANTEED];
177  ECHO = 2 [(jaia.ev).rest_api.presence = GUARANTEED];
178  }
179  optional BotType bot_type = 7 [(jaia.field).rest_api.presence = GUARANTEED];
180 
181  optional GeographicCoordinate location = 10
182  [(jaia.field).rest_api.presence = GUARANTEED];
183 
184  optional double depth = 11 [
185  (dccl.field) = {
186  min: -1
187  max: 100
188  precision: 1
189  units: { derived_dimensions: "length" }
190  },
191  (jaia.field).rest_api.presence = GUARANTEED
192  ];
193 
194  message Attitude
195  {
196  optional double roll = 1 [
197  (dccl.field) = {
198  min: -180
199  max: 180
200  precision: 0
201  units {
202  derived_dimensions: "plane_angle"
203  system: "angle::degree"
204  }
205  },
206  (jaia.field).rest_api.presence = GUARANTEED
207  ];
208  optional double pitch = 2 [
209  (dccl.field) = {
210  min: -180
211  max: 180
212  precision: 0
213  units {
214  derived_dimensions: "plane_angle"
215  system: "angle::degree"
216  }
217  },
218  (jaia.field).rest_api.presence = GUARANTEED
219  ];
220  optional double heading = 3 [
221  (dccl.field) = {
222  min: 0
223  max: 360
224  precision: 0
225  units {
226  derived_dimensions: "plane_angle"
227  system: "angle::degree"
228  }
229  },
230  (jaia.field).rest_api.presence = GUARANTEED
231  ];
232  optional double course_over_ground = 4 [
233  (dccl.field) = {
234  min: 0
235  max: 360
236  precision: 0
237  units {
238  derived_dimensions: "plane_angle"
239  system: "angle::degree"
240  }
241  },
242  (jaia.field).rest_api.presence = GUARANTEED
243  ];
244  }
245  optional Attitude attitude = 20
246  [(jaia.field).rest_api.presence = GUARANTEED];
247 
248  message Speed
249  {
250  optional double over_ground = 1 [
251  (dccl.field) = {
252  min: -5
253  max: 10
254  precision: 1
255  units { derived_dimensions: "velocity" }
256  },
257  (jaia.field).rest_api.presence = GUARANTEED
258  ];
259  optional double over_water = 2 [(dccl.field) = {
260  min: -5
261  max: 10
262  precision: 1
263  units { derived_dimensions: "velocity" }
264  }];
265  }
266  optional Speed speed = 30 [(jaia.field).rest_api.presence = GUARANTEED];
267 
268  optional MissionState mission_state = 40
269  [(jaia.field).rest_api.presence = GUARANTEED];
270 
271  // bounds should match MissionPlan.goal max_repeat value *
272  // expected_fragments max
273  optional int32 active_goal = 41 [
274  (dccl.field) = { min: 0 max: 29 },
275  (jaia.field).rest_api.presence = GUARANTEED
276  ];
277  optional double distance_to_active_goal = 42 [
278  (dccl.field) = {
279  min: 0
280  max: 1000
281  precision: 1
282  units: { derived_dimensions: "length" }
283  },
284  (jaia.field).rest_api.presence = GUARANTEED
285  ];
286  optional uint32 active_goal_timeout = 43 [
287  (dccl.field) = {
288  min: 0
289  max: 3600
290  precision: 0
291  units { base_dimensions: "T" }
292  },
293  (jaia.field).rest_api.presence = GUARANTEED
294  ];
295  optional int32 repeat_index = 44 [
296  (dccl.field) = { min: 0 max: 1000 precision: 0 },
297  (jaia.field).rest_api.presence = GUARANTEED
298  ];
299 
300  optional double salinity = 51
301  [(dccl.field) = { min: 0 max: 100 precision: 1 }];
302 
303  optional double temperature = 52 [(dccl.field) = {
304  min: -50
305  max: 100
306  precision: 2
307  units { derived_dimensions: "temperature" system: "celsius" }
308  }];
309 
310  optional double thermocouple_temperature = 53 [(dccl.field) = {
311  min: -50
312  max: 100
313  precision: 2
314  units { derived_dimensions: "temperature" system: "celsius" }
315  }];
316 
317  optional double vv_current = 54 [(dccl.field) = {
318  min: -5
319  max: 1000
320  precision: 2
321  units { derived_dimensions: "current" }
322  }];
323 
324  optional double vcc_current = 55 [(dccl.field) = {
325  min: -5
326  max: 1000
327  precision: 2
328  units { derived_dimensions: "current" }
329  }];
330 
331  optional double vcc_voltage = 56 [(dccl.field) = {
332  min: 0
333  max: 25
334  precision: 2
335  units { derived_dimensions: "electric_potential" system: "si" }
336  }];
337 
338  optional double battery_percent = 57 [
339  (dccl.field) = { min: 0 max: 100 precision: 0 },
340  (jaia.field).rest_api.presence = GUARANTEED
341  ];
342 
343  optional int32 calibration_status = 58 [(dccl.field) = { min: 0 max: 3 }];
344 
345  optional IMUCalibrationState calibration_state = 59;
346 
347  optional double hdop = 60 [(dccl.field) = { min: 0 max: 100 precision: 2 }];
348 
349  optional double pdop = 61 [(dccl.field) = { min: 0 max: 100 precision: 2 }];
350 
351  optional int32 wifi_link_quality_percentage = 62 [
352  (dccl.field) = { min: 0 max: 100 precision: 0 },
353  (jaia.field).rest_api.presence = GUARANTEED
354  ];
355 
356  optional uint64 received_time = 63 [
357  (dccl.field) = {
358  omit: true
359  units { prefix: "micro" derived_dimensions: "time" }
360  },
361  (jaia.field).rest_api.presence = GUARANTEED
362  ];
363 }
364 
365 message DriftPacket
366 {
367  option (dccl.msg) = {
368  unit_system: "si"
369  };
370 
371  optional int32 drift_duration = 1 [
372  default = 0,
373  (dccl.field) = {
374  min: 0
375  max: 3600
376  precision: -1
377  units { base_dimensions: "T" }
378  },
379  (jaia.field).rest_api.presence = GUARANTEED
380  ];
381 
382  message EstimatedDrift
383  {
384  required double speed = 1 [
385  (dccl.field) = {
386  min: 0
387  max: 10
388  precision: 1
389  units { derived_dimensions: "velocity" }
390  },
391  (jaia.field).rest_api.presence = GUARANTEED
392  ];
393 
394  optional double heading = 3 [
395  (dccl.field) = {
396  min: 0
397  max: 360
398  precision: 0
399  units {
400  derived_dimensions: "plane_angle"
401  system: "angle::degree"
402  }
403  },
404  (jaia.field).rest_api.presence = GUARANTEED
405  ];
406  }
407 
408  // should correspond to ocean current velocity
409  optional EstimatedDrift estimated_drift = 10
410  [(jaia.field).rest_api.presence = GUARANTEED];
411 
412  // location C
413  optional GeographicCoordinate start_location = 11
414  [(jaia.field).rest_api.presence = GUARANTEED];
415  // location D
416  optional GeographicCoordinate end_location = 12
417  [(jaia.field).rest_api.presence = GUARANTEED];
418 
419  // Significant wave height is defined as the average wave height,
420  // from trough to crest, of the highest one-third of the waves
421  optional double significant_wave_height = 13 [
422  (dccl.field) = {
423  min: 0
424  max: 50
425  precision: 3
426  units: { derived_dimensions: "length" }
427  },
428  (jaia.field).rest_api.presence = GUARANTEED
429  ];
430 }
431 
432 message DivePacket
433 {
434  option (dccl.msg) = {
435  unit_system: "si"
436  };
437 
438  required double dive_rate = 10 [
439  (dccl.field) = {
440  min: 0
441  max: 10
442  precision: 1
443  units { derived_dimensions: "velocity" }
444  },
445  (jaia.field).rest_api.presence = GUARANTEED
446  ];
447 
448  optional double unpowered_rise_rate = 11 [
449  (dccl.field) = {
450  min: 0
451  max: 10
452  precision: 1
453  units { derived_dimensions: "velocity" }
454  },
455  (jaia.field).rest_api.presence = GUARANTEED
456  ];
457 
458  optional double powered_rise_rate = 12 [
459  (dccl.field) = {
460  min: 0
461  max: 10
462  precision: 1
463  units { derived_dimensions: "velocity" }
464  },
465  (jaia.field).rest_api.presence = GUARANTEED
466  ];
467 
468  required double depth_achieved = 13 [
469  (dccl.field) = {
470  min: 0
471  max: 100
472  precision: 1
473  units: { derived_dimensions: "length" }
474  },
475  (jaia.field).rest_api.presence = GUARANTEED
476  ];
477 
478  message Measurements
479  {
480  optional double mean_depth = 1 [
481  (dccl.field) = {
482  min: 0
483  max: 100
484  precision: 1
485  units: { derived_dimensions: "length" }
486  },
487  (jaia.field).rest_api.presence = GUARANTEED
488  ];
489 
490  optional double mean_temperature = 2 [
491  (dccl.field) = {
492  min: -1
493  max: 50
494  precision: 1
495  units { derived_dimensions: "temperature" system: "celsius" }
496  },
497  (jaia.field).rest_api.presence = GUARANTEED
498  ];
499 
500  optional double mean_salinity = 3 [
501  (dccl.field) = { min: 0 max: 45 precision: 1 },
502  (jaia.field).rest_api.presence = GUARANTEED
503  ];
504  }
505 
506  repeated Measurements measurement = 14 [
507  (dccl.field) = { max_repeat: 50 },
508  (jaia.field).rest_api.presence = GUARANTEED
509  ];
510 
511  // location A
512  optional GeographicCoordinate start_location = 15
513  [(jaia.field).rest_api.presence = GUARANTEED];
514 
515  optional double duration_to_acquire_gps = 16 [
516  (dccl.field) = {
517  min: 0
518  max: 120
519  precision: 1
520  units { base_dimensions: "T" }
521  },
522  (jaia.field).rest_api.presence = GUARANTEED
523  ];
524 
525  // Did we reach seafloor?
526  optional bool bottom_dive = 17
527  [default = false, (jaia.field).rest_api.presence = GUARANTEED];
528 
529  // Did we reach min depth?
530  optional bool reached_min_depth = 18
531  [default = false, (jaia.field).rest_api.presence = GUARANTEED];
532 
533  // If we reached bottom, what was the bottom type
534  enum BottomType
535  {
536  HARD = 1 [(jaia.ev).rest_api.presence = GUARANTEED];
537  SOFT = 2 [(jaia.ev).rest_api.presence = GUARANTEED];
538  }
539 
540  optional BottomType bottom_type = 19
541  [(jaia.field).rest_api.presence = GUARANTEED];
542 
543  // For bottom characterization
544  optional double max_acceleration = 20 [
545  (dccl.field) = {
546  min: 0
547  max: 100
548  precision: 1
549  units { derived_dimensions: "acceleration" }
550  },
551  (jaia.field).rest_api.presence = GUARANTEED
552  ];
553 }
554 
555 message TaskPacket
556 {
557  /*
558  Actual maximum size of message: 218 bytes / 1744 bits
559  dccl.id head..........................16
560  user head..............................0
561  body................................1728
562  padding to full byte...................0
563  Allowed maximum size of message: 250 bytes / 2000 bits
564  */
565  option (dccl.msg) = {
566  id: 0x5001
567  max_bytes: 250
568  codec_version: 4
569  unit_system: "si"
570  };
571 
572  required uint32 bot_id = 1 [
573  (dccl.field) = { min: 0 max: 255 },
574  (jaia.field).rest_api.presence = GUARANTEED
575  ];
576  required uint64 start_time = 2 [
577  (dccl.field) = {
578  codec: "dccl.time2"
579  units { prefix: "micro" derived_dimensions: "time" }
580  },
581  (jaia.field).rest_api.presence = GUARANTEED
582  ];
583  required uint64 end_time = 3 [
584  (dccl.field) = {
585  codec: "dccl.time2"
586  units { prefix: "micro" derived_dimensions: "time" }
587  },
588  (jaia.field).rest_api.presence = GUARANTEED
589  ];
590  required MissionTask.TaskType type = 4
591  [(jaia.field).rest_api.presence = GUARANTEED];
592 
593  optional DivePacket dive = 10 [(jaia.field).rest_api.presence = GUARANTEED];
594  optional DriftPacket drift = 11
595  [(jaia.field).rest_api.presence = GUARANTEED];
596 }